Afficher une forme par dessu une autre

Résolu/Fermé
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 - 20 avril 2020 à 17:57
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 - 21 avril 2020 à 19:08
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

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
21 avril 2020 à 09:10
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);
1
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
21 avril 2020 à 09:37
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);
    }
}
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2 > KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024
Modifié le 21 avril 2020 à 19:11
Et Bien KX merci beaucoup pour ces précieux conseils et explications.

0