Affichage perso par paintComponent
Bonjour à tous, malgré les infos nombreuses, il y a quelque chose qui m'échappe...
L'objectif est de dessiner des formes simples dans le ContentPane, sur le click souris, grâce à un listener.
Le composant est un simple rectangle de couleur sombre, qui s'affiche à l'endroit du click. La classe est :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;
/*
* ICI ON DEFINIT LE COMPOSANT A AFFICHER
*/
public class Composant extends JComponent{
private static final long serialVersionUID = 1L;
public Composant() {
System.out.println("je suis dans le constructeur du composant");
}
//---ré-écriture de "paintComponent" appelée à chaque création d'objet---
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//--- fond du contentPane en jaune + un rectangle sombre ---
System.out.println("je débute dans le paintComponent à moi");
MyWindow.Contenu.setBackground(Color.YELLOW);
g.setColor(new Color (100,100,100));
g.fillRect(ListenerW.x0, ListenerW.y0, 100, 100);
System.out.println("j'ai fini le paintComponent à moi");
}
} |
Au click de souris on lance l'écouteur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class ListenerW implements MouseListener {
static int x0,y0;
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("je débute dans le listenerW");
x0 = e.getX();
y0 = e.getY();
MyWindow.Contenu.add(new Composant() );
MyWindow.Contenu.repaint();
System.out.println("j'ai fini dans le listenerW");
} |
Quand je clique sur le ContentPane, la fenetre de base, blanche s'affiche le message est le suivant sur la console :
je débute dans le listenerW
je suis dans le constructeur du composant
j'ai fini dans le listenerW
Question 1 : je suis bien passé par le constructeur Composant(), mais la fonction overide paintComponent (Graphics g) n'est pas exécutée à la construction de l'objet, puisque l'affichage console lié n'est pas apparent.
Il est pourtant indiqué que paintComponent est exécuté à chaque création d'objet.... Que se passe-t-il réellement?
Question 2 : Si je redimensionne la fenêtre après un clic , le fond jaune apparait alors, ce qui suppose que le paintComponent overide est appelé dans ce cas, (confirmation par affichage console lié) mais le rectangle sombre, pourtant définit au même endroit, n'apparait toujours pas. Pourquoi??
Merci à tous ceux qui éclaireront ma lanterne...:oops:
2 pièce(s) jointe(s)
Poursuite du problème pour un connaisseur de la classe graphics...
Bonjour à tous, j'ai eu beaucoup de vues, mais hélas, pas de réponse....;)
J'ai continué à chercher et en jouant sur le "layout" j'ai avancé, mais j'ai toujous un Bug si j'agis avec un "listener" de souris.
1/ Présentation du fonctionnement correct :
j'ai créé un composant simple, pour essai, en ré-écrivant le "paintComponent" d'une classe à moi "Composant" :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;
/*
* ICI ON DEFINIT LE COMPOSANT A AFFICHER
*/
public class Composant extends JComponent {
private static final long serialVersionUID = 1L;
//---ré-écriture de "paintComponent" appelée à chaque création d'objet---
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("je débute dans le paintComponent à moi");
//--- fond du contentPane en jaune + un rectangle rouge ---
g.setColor(Color.yellow);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(Color.RED);
g .fillRect(300,300, 60 , 60);
System.out.println("j'ai fini dans le paintComponent");
}
} |
je ensuite créé une fenêtre avec un "ContentPane" nommé "contentpane" avec un "new LayOut()".
(noter que le listener souris est pour le moment neutralisé car mis en commentaire :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public class MyWindow extends JFrame implements MouseListener{
//---MES VARIABLES---
JPanel contentpane = new JPanel() ;
int[] inter = new int [10]; // tableau de 10 inter.
ListenerW listenerW = new ListenerW();
//---CONSTRUCTEUR DE MYWINDOW---
/* la fenetre est :
* toujours visible, au premier plan,
* de taille 800x800,
* se ferme quand on clique sur la croix,
* sont centrées sur l'écran.
* je créé une barre de menu.
*
*/
public MyWindow (String string) {
super ();
this.setTitle(string);
this.isAlwaysOnTop();
this.setSize(500, 500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(true);
// this.addMouseListener(this);
this.setContentPane(contentpane);
contentpane.setLayout(new BorderLayout());
contentpane .add( new Composant()) ;
} |
A la constructeur de la fenêtre, j'ajoute un "new Composant()" et il apparait, et donc, tout va bien.
Le composant est bien crée, et dessiné dans le "contentpane"...:P
Pièce jointe 586359
2/ Une modification infime, et ca ne fonctionne plus.
En effet, je souhait afficher mon composant, non pas à la construction de la fenêtre, mais après avoir cliqué sur le contentpane.
Je neutralise le "contentpane .add( new Composant()) ;" par un commentaire, et je mets cette ligne dans mon listener de souris..
je réactive le listener en retirant les "//" qui le maintenaient en commentaire.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public MyWindow (String string) {
super ();
this.setTitle(string);
this.isAlwaysOnTop();
this.setSize(500, 500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(true);
this.addMouseListener(this);
this.setContentPane(contentpane);
contentpane.setLayout(new BorderLayout());
// contentpane .add( new Composant()) ;
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("je débute dans le listener");
contentpane .add( new Composant()) ;
System.out.println("j'ai fini dans le listener");
} |
Cela ne devrait rien changer, mais résultat.... Et pourtant si!!:calim2:
Je passe bien par mon "listener" au clic, car je vois les messages de contrôle sur la console, mais le composant ne semble pas avoir été crée, car pas de passage par mon "paintComponent" maison.. Même en re-dimensionnant la fenêtre, pas de réaction.
Pièce jointe 586360
Voila mon petit problème du soir!.....
Pourquoi le fait de passer par le "listener" ne permet pas de charger le composant graphique et de l'afficher???
Merci à tous ceux qui prendront la peine de lire et peut-être de trouver...:oops: