Coucou me revoilou.
Je souhaite savoir sir les composants de type JComponent ou JPanel disposent d'un système d'affichage propre, donc si on peut obtenir une pointeur sur un objet graphics et donc dessiner dessus ?
d'avance merci.
Coucou me revoilou.
Je souhaite savoir sir les composants de type JComponent ou JPanel disposent d'un système d'affichage propre, donc si on peut obtenir une pointeur sur un objet graphics et donc dessiner dessus ?
d'avance merci.
Salut,
Tu peux très bien redéfinir la méthode paintComponent() pour déssiner dessus comme bon te semble...
Cette méthode est appellé automatiquement lorsque il y a besoin de redessiner le composant. Elle doit donc redéssiner le composant dans sa totalité.
a++
Ok merci, mais en admettant que je désire seulement dessiner un rectangle ou une ligne sur cette surface ?
Et bien il suffit d'utiliser l'objet Graphics en paramètre pour y dessiner ce que tu souhaites.Envoyé par SheikYerbouti
Et si ton composant est rendu à l'écran (et pas imprimé), tu peux utiliser caster cet objet en Graphics2D qui offre plus de possibilitées...
a++
Ok, tu confirme que je peut utiliser le résultat de getGraphics() directemetn sur ces 2 objets alors ?
Dans ta redéfinition du paintComponent(Graphics g), il faudra de toute façon appeler la super méthode super.paintComponent(g). Elle redessinera ton composant normalement.
Il suffit ensuite d'ajouter ce que tu veux !
edit : Whoua ! Bien à la bourre, moi... M'enfin...
N'appelle pas getGraphics(), il faut surcharger paintComponent() sinon ton dessin ne restera pas à l'écran.
En fait je l'appelle pour initialiser un objet Graphics2D, histoire de pouvoir utiliser la fonction setStroke(). et le dessin perdure bien.Envoyé par Gfx
Cependant, il est dessiné sur le fond du panel, avant que les autres composants ne soient dessinés.
Existe t-il un moyen de dessiner par dessus les autres composants et ce, de façon durable ?
Le glasspane, mais par contre il faut vraiment redéfinir la méthode paintComponent et ne pas appeler getGraphics (les graphics te sont fournis en paramètres de cette méthode)
Pour le glasspane il te faudra créer un panel transparent (et pas simplement opaque) sur lequel tu dessinera par la suite et que tu affecteras avec un setGlassPane sur ta JFrame.
SInon tu peux également passer par un JLayeredPane
Ok merci.
Ces objets sont-ils disponible avec la version 1.3 du JRE ?
Pour créer un glass pane transparent il suffit d'hériter de JComponent et pas de JPanel (JPanel est un simple JComponent opaque, rien de plus).
J'hérite effectivement de JComponent. ça devrait le faire, alorsEnvoyé par Gfx
![]()
Vous êtes sûr que ces fonctionalités sont dispo en 1.3 ?
Alors là, je voudrais dire que : ExcellentEnvoyé par sinok
![]()
Le procédé marche -t il avec la classe canvas ?
J'utilise ce cnavas pour dessiner une image puis l'insérer dans un JPanel, mon souci est que l'image s'affiche une fois au démarrage (tel un flash) puis disparait..
Or la classe canvas n'est pas un JComponent et ne possède donc pas de fonction paintCOmponent() j'ai alors redéfinit paint(graphics g) avec la méthode du double buffering software mais rien n'y fait
Avez vous une idée ?
Non canvas est issu d'AWT, pas de swing, et AWT ne possède pas de mécanisme de GlassPane.
Enfin le plus simple est que tu remplaces ton Canvas par un JCOmponent ou un JPanel et que tu redéfinisse la méthode paintComponent.
D'autant plus que ton code mélange AWT et Swing ce qui est considéré comme un bad practice.
Et tout ce que tu peux faire sur un Canvas tu peux le faire sur un JPanel à deux trois exceptions près
Ok !
Je te remercie de ta clarté ...je pensais que les classes Swing étaient héritées de AWT.
A l'avenir je suivrais tes conseils dans la programmation de GUI
Je vous tiens au courant sur ce code
dans mon source on voit dans la fonction paintComponent que j'utilise la fonction createImage du JPanel Diagramm...ici Diagram est inclue dans la moitié dans la fenetre principale..
Mon nouveau problème est que l'image qui s'affiche (pas tout le temps d'ailleurs) récupère toute la fenetre..je suppose que le context graphique g qui est passé recupère donc toute la fenete (en taille)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 protected void paintComponent(Graphics g){ //création du buffer si il n'existe pas if(buffer==null){ Imagetemp = Diagramm.createImage(Diagramm.getWidth(), Diagramm.getHeight()); buffer = Imagetemp.getGraphics(); } //on dessine sur le buffer mémoire //ici le dessin n'est pas traité pour la clarté de la question // finalement, le buffer mémoire est dessiné dans le buffer d'affichage g.drawImage(Imagetemp,Diagramm.getX(),Diagramm.getY(),Diagramm.getWidth(), Diagramm.getHeight(),this); buffer.dispose();
mais dans ce cas pourquoi utiliser la fonction paint COmponent (rapport avec Heavy, Lightweight ?)
Partager