IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Affichage perso par paintComponent


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  2. #2
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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"...

    Nom : panel1.png
Affichages : 69
Taille : 18,9 Ko



    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!!
    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.
    Nom : panel2.png
Affichages : 87
Taille : 15,7 Ko

    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...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Affichage page par page et requêtes du type $sql .=
    Par carelha dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 06/04/2006, 17h12
  2. Réponses: 10
    Dernier message: 20/03/2006, 16h11
  3. [Tableaux] PB liens apres affichage page par page
    Par x2thez dans le forum Langage
    Réponses: 16
    Dernier message: 15/03/2006, 16h58
  4. [C#] Comment implementer mon Navigateur perso par défaut ?
    Par ArHacKnIdE dans le forum Windows Forms
    Réponses: 8
    Dernier message: 12/02/2006, 18h53
  5. affichage colonne par colonne
    Par tjoce dans le forum Langage
    Réponses: 1
    Dernier message: 02/11/2005, 18h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo