paintComponent() vs paint() et Composite vs Toile, un pinceau de type GUI
J'ai eu quelques idées intéressantes et des critiques de cette, cette et cette post (voir dernier post le code de l'interface graphique en question). Néanmoins, je suis encore assez confus au sujet de certaines choses. Essentiellement, ce est la façon la moins chère de l'affichage de l'utilisateur introduit les graphiques?
Plus précisément, j'ai utilisé un paintComponent()
méthode de JPanel
classe en faisant un objet de cette classe dans le MouseDragged()
méthode avec paintComponent(getGraphics())
méthode (AuxClass2
et AuxClass1
en conséquence).
Apparemment, à l'aide de getGraphics()
et paintComponent()
au lieu de repaint()
sont de mauvaises idées, je soupçonne que quelque chose à voir avec l'utilisation de la mémoire. Aussi l'appel de la AuxClass2
chaque fois que l'utilisateur fait glisser la souris est également une mauvaise idée.
Également un Composite vs Toile (c'est à dire swing vs awt) est un peu déroutant. Ce qui est utilisé et quand?
J'ai essayé de trouver une des solutions de contournement, mais n'ont pas trouvé un, surtout pour les getGraphics()
méthode: comment le graphisme peut-il être ajouté au panneau?
OriginalL'auteur Alex | 2012-08-29
Vous devez vous connecter pour publier un commentaire.
Vous vous souvenez de ce qui doit être peint comme une variable et utiliser que dans paintComponent().
Par exemple, ce qui vous semble être d'essayer de faire dans votre autre question serait:
Voir aussi http://docs.oracle.com/javase/tutorial/uiswing/painting/
repaint()
efface déjà peintes choses. Est-il possible de l'éviter?Non, parce que vous ne savez pas ce qui doit repeindre (l'utilisateur pourrait avoir déplacé une autre fenêtre sur votre fenêtre), pour que la peinture composant doit repeindre la totalité du composant (à l'intérieur du clip spécifié). Vous pouvez utiliser Andrew approche de la peinture sur une image et de la peinture que de l'image dans paintComponent.
Est-ce à dire que, dans le cas où j'ai besoin de garder l'ensemble de la peinture, par exemple, enregistrer sur un disque dur, je ne devrais pas utiliser
Canvas
ouJPanel
tous, au lieu d'utiliserBufferedImage
?Cela ne devrait pas être accepté de répondre. Il n'y a pratiquement pas d'explication, et l'une des deux phrases qui est une partie de l'explication est incomplète phrase qui n'a aucun sens, et ne peut pas être fait sens puisqu'il n'y a pas de contexte pour déduire quoi que ce soit.
OriginalL'auteur Walter Laan
Lourd vs poids léger
Fondamentalement parlant, un poids lourd composant est lié à ses propres pairs, où la lumière du poids des composants partagent un natif par les pairs.
En général, ce n'est pas une bonne idée de mélanger lourd et léger poids des composants comme il y a des problèmes avec l'ordre z et dans mon expérience (même si c'est censé être mieux maintenant) il y a de la peinture problèmes qui peuvent surgir.
C'est la raison pour laquelle vous avez été découragés de l'aide de l'
Canvas
classe, probablement parce que vous étiez en essayant de le placer sur un peu de poids de composant...je suppose queL'illusion de contrôle
L'un des plus grands problèmes pour les nouveaux arrivants à la Swing API est l'illusion que vous avez une sorte de contrôle sur le processus de peinture, vous n'avez pas. Il est plus facile de simplement l'accepter.
Le meilleur que vous pouvez faire est de demander que le repeindre le gestionnaire de mise à jour dans les meilleurs délais.
Aussi, appelant
getGraphics
n'est pas garanti pour retourner une valeur non null.Le bon ordre des choses
paint
vspaintComponent
Le problème ici est
paint
un nombre important d'emplois, l'appel depaintComponent
est juste l'un d'eux.En Swing nous sommes très encouragés à utiliser
paintComponent
chaque fois que nous voulons effectuer la peinture custom, c'est, en général, le niveau le plus bas sur le composant et est appelée avant que l'enfant composants sont peints.Si vous remplacez
paint
, puis appliquez la peinture sur leGraphics
après l'appel àsuper.paint
vous finirez vers le haut de la peinture au-dessus de tout, ce n'est pas toujours le résultat souhaitéMême si c'était le cas, l'enfant composants peuvent être peints de manière indépendante de leur conteneur parent, la peinture qui est "au dessus" de la peinture sur les effets que vous pourriez avoir ajouté
Liens utiles
De séparation des pensées
Seuls les éléments qui sont ajoutés à un composant, qui est attaché à un natif de pairs auront jamais il
paint
méthode appelée. Donc, essayer de peindre à un composant qui n'a pas été ajouté à un conteneur, mais est plutôt inutile...Généralement parlant, la peinture de la chaîne d'ressemble à quelque chose comme
paint
->paintComponent
->paintBorder
->paintChildren
. Il est facile de manquer l'appel desuper.paint
et ayant étrange et bizarre peinture résultats, mais aussi, c'est facile d'avoir de la peinture soit remplacé (par appelsuper.paint
APRÈS que vous avez fait de la peinture custom) ou de la peinture réalisée sur l'enfant composants, ce qui peut sembler comme une bonne idée, mais, chaque composant enfant peut être peint indépendamment du conteneur parent, ce qui signifie qu'il est possible que tout ce que vous avait été peint sur le dessus pour être être annuléeJ'ai définitivement un problème comme ça, mais je vais avoir de la difficulté à comprendre comment le corriger. En gros, j'ai un Composite avec un BorderLayout. À l'intérieur il y a 3 JLists, 2 qui ont des frontières et celui qui n'en a pas, tous avec le contenu varie. J'ai besoin de la JList ont déjà été peints pour avoir l'Objet Graphique initialisé, afin d'utiliser les Graphiques de la figure la largeur du texte à l'intérieur de la liste, et de la Frontière de texte (à l'aide de la Frontière avec le texte). Le problème c'est que je dois le parent Composite pour redimensionner basé sur la largeur maximale de n'importe quel texte dans n'importe quelle liste, mais je ne peux pas semblent déterminer l'ordre
OriginalL'auteur MadProgrammer
Utiliser un
BufferedImage
que la peinture de la surface. L'afficher dans unJLabel
. Placez l'étiquette dans le centre d'un panneau à l'intérieur d'unJScrollPane
.Appel
bufferedImage.getGraphics()
en tant que de besoin, mais n'oubliez pas dedispose()
de lorsque vous avez terminé, et ensuite appelerlabel.repaint()
.Utiliser Swing tout au long de composants, et de ne pas remplacer quoi que ce soit.
Voici un exemple d'utilisation d'une image comme la peinture de la surface.
Et voici un meilleur!
Je n'ai pas dit le capture d'écran était mieux, c'est le code qui est mieux. 😉
OriginalL'auteur Andrew Thompson