Deplacement d'un Bouton dan un JPanel

Résolu/Fermé
manoa21 Messages postés 9 Date d'inscription dimanche 3 juin 2012 Statut Membre Dernière intervention 20 juin 2012 - 10 juin 2012 à 12:16
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 10 juin 2012 à 17:30
Bonjour !

J'ai essayer de déplacer un bouton dans un J Panel et j'ai quelques problème: Le bouton se déplace mais les autres positions que le bouton a prise s'affiche encore et en plus quand on le relâche, elle prends sa position initiale. Or quand on le déplace dans un JFrame le bouton se déplace très biens. je remercie d'avance tout ce qui vont répondre a ce problème.
Voici ci dessous les codes:

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

import javax.swing.JButton;
import javax.swing.JFrame;

public class Fenetre extends JFrame
{
	private static final long serialVersionUID = 1L;
	
	
	public static JButton b,c;
	
	public Fenetre()
	{
		setTitle("Carte des pôles et des Zéros");
		setSize(800,600);		
		setLocationRelativeTo(null);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(null);
		setVisible(true);
	}

	public static void main(String...args)
	{
		Fenetre fen = new Fenetre();
		fen.setContentPane(new Panneau());
		fen.repaint();
	}
}



et voici le code de JPanel

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.*;

public class Panneau extends JPanel{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	public static JButton pole1;
	public Panneau(){
	}
	public void paintComponent(Graphics g){
		
		pole1=new JButton("bouton");
		pole1.setBounds(100,240, 10, 10);
		pole1.setBackground(Color.RED);
		pole1.addMouseMotionListener(new MouseMotionListener()
		{
			private int dx,dy;
			
			public void mouseDragged(MouseEvent e) 
			{
				if (((pole1.getX()+e.getX()-dx)>=35)&&((pole1.getX()+e.getX()-dx)<375)&&((pole1.getY()+e.getY()-dy)>=50)&&((pole1.getY()+e.getY()-dy)<390) )
					{
						pole1.setLocation(pole1.getX()+e.getX()-dx, pole1.getY()+e.getY()-dy);
					}
			}

			public void mouseMoved(MouseEvent e) 
				{
					dx = e.getX();
					dy = e.getY();
				}
		});
		add(pole1);
		}
		
	}

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 10/06/2012 à 17:35
J'aimerais bien savoir pourquoi tu as mis ton code dans paintComponent !
En gros tu créés un nouveau bouton à chaque fois que la fenêtre est rafraîchi, tu te retrouves donc avec des centaines de boutons qui seront tous initialisés au même endroit (avec setBounds) et déplacés selon le listener alors que le bouton déplacé aura une origine qui dépendra du dernier bouton créé (et non de celui que tu es en train de déplacer !)

De plus, la première instruction à mettre dans un paintComponent, c'est de rappeler la méthode de la classe mère... sinon le rafraichissement ne se fait pas et tu as des traces qui se promènent.

Enfin, pour être cohérent, il vaut mieux figer les valeurs des getX/getY dans une variable avant de faire tes tests et tes modifications, car elles peuvent changer au cours du calcul, et faire des résultats bizarres (en plus c'est plus clair)

Une dernière remarque : il serait judicieux d'initialiser la position de ton bouton à l'intérieur de la zone sur laquelle tu l'autorises à se déplacer... sinon le déplacement de départ va être bloqué si tu ne te déplaces pas au moins vers la zone autorisée.

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

import javax.swing.JButton;
import javax.swing.JPanel;

public class Panneau extends JPanel
{
    private static final long serialVersionUID = 1L;
    
    public static JButton pole1;
    
    public Panneau()
    {
        pole1=new JButton("bouton");
        
        pole1.setBounds(100,240, 10, 10); // TODO
        pole1.setBackground(Color.RED);
        pole1.addMouseMotionListener(new MouseMotionListener()
        {
            private int dx,dy;
            
            public void mouseDragged(MouseEvent e) 
            {
                int x = pole1.getX()+e.getX()-dx;
                int y = pole1.getY()+e.getY()-dy;
                
                if (x>=35 && x<375 && y>=50 && y<390)
                {
                    pole1.setLocation(x, y);
                }
            }

            public void mouseMoved(MouseEvent e) 
            {
                dx = e.getX();
                dy = e.getY();
            }
        });
        
        add(pole1);
    }
    
//    public void paintComponent(Graphics g)
//    {
//        super.paintComponent(g);        
//    }        
}

La confiance n'exclut pas le contrôle
0