Afficher une forme par dessu une autre [Résolu]

Signaler
Messages postés
83
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
23 août 2020
-
Messages postés
83
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
23 août 2020
-
Bonjour à tous,

J'ai un problème que je ne comprend pas. Voila, je souhaite insérer un carré par dessus un rond lors d’un clic, mais le carré ce trouve toujours en dessous du rond. Pourquoi?

Voici mon code:

package evenement_souris.fr;

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Fenetre extends JFrame implements MouseListener
{
	Fenetre()
	{
		this.setTitle("EvenementSouris");
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(800, 800);
		
		Rond rond = new Rond();
		this.getContentPane().add(rond);
		this.setVisible(true);
		
		this.addMouseListener(this);
	}
	
	@Override
	public void mouseClicked(MouseEvent arg0) {}

	@Override
	public void mouseEntered(MouseEvent arg0) {}

	@Override
	public void mouseExited(MouseEvent arg0) {}

	@Override
	public void mousePressed(MouseEvent arg0) 
	{
		this.getContentPane().add(new Carre(Color.GREEN));
		validate();
		repaint();
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {}

}


Merci pour votre aide.
Configuration: Linux / Firefox 75.0

1 réponse

Messages postés
16040
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 septembre 2020
2 679
Bonjour,
"le carré ce trouve toujours en dessous du rond. Pourquoi?"
Parce que c'est ainsi qu'il est prévu que la méthode Container.html#add(Component) fonctionne :
"Appends the specified component to the end of this container."
Si tu veux changer l'ordre, il faut utiliser la méthode Container.html#add(Component,int)
"Adds the specified component to this container at the given position."
Exemple :
this.getContentPane().add(new Carre(Color.GREEN), 0);
Messages postés
16040
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 septembre 2020
2 679
Quelques autres remarques sur ton code :

1)
package evenement_souris.fr;

Dans un nom de package on ne devrait pas avoir de
_
et les différents champs doivent être du plus générique (dossier parent) vers le plus spécifique (sous-dossier), dans ton cas on devrait donc avoir :
package fr.evenement.souris;
(avec les dossiers qui vont bien)

2)
public class Fenetre extends JFrame implements MouseListener

Il vaut mieux séparer dans des classes distinctes, l'objet manipulé (JFrame) et l'objet qui le manipule (MouseListener), cela évite des classes fourre-tout et du code comme
this.addMouseListener(this);
où en réalité
this
est deux choses différentes (une JFrame à gauchen un MouseListener à droite).

3)
this.getContentPane().add(rond);

D'une part, le this est facultatif (et ce qui est facultatif ne devrait pas être mis, ça alourdit le code), d'autre part la classe JFrame étant également un Container, elle a déjà une méthode add, il est donc inutile de passer par le contentPane.

4)
public void mouseClicked(MouseEvent arg0) {}

Pour simplifier ton MouseListener et éviter l'implémentation de méthodes vides, tu peux utiliser un MouseAdapter et ne surcharger que les méthodes que tu veux définir.

5)
this.getContentPane().add(new Carre(Color.GREEN));

Attention, à chaque clic tu vas créer et ajouter un nouvel objet, est-ce bien ce que tu veux faire ?
Si tu veux n'afficher qu'une seule fois le carré ou si tu as l'intention de cliquer beaucoup de fois et d'afficher plein de carrés, cela semble une mauvaise approche.

Code corrigé avec mes remarques :
package fr.evenement.souris;

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class Fenetre extends JFrame {    
    private Rond rond = new Rond();
    private Carre carre = null;

    public Fenetre() {
        setTitle("EvenementSouris");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800, 800);

        add(rond);
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent event) {
                if (carre == null) {
                    carre = new Carre(Color.GREEN);
                    add(carre, 0);
                    validate();
                }
            }
        });

        setVisible(true);
    }
}
Messages postés
83
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
23 août 2020
1 >
Messages postés
16040
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 septembre 2020

Et Bien KX merci beaucoup pour ces précieux conseils et explications.