[Swing] Déplacement de JButton

Résolu/Fermé
Manoa1 Messages postés 8 Date d'inscription mercredi 13 octobre 2010 Statut Membre Dernière intervention 14 juillet 2012 - Modifié par Chris 94 le 7/07/2012 à 15:52
Manoa1 Messages postés 8 Date d'inscription mercredi 13 octobre 2010 Statut Membre Dernière intervention 14 juillet 2012 - 14 juil. 2012 à 08:40
Bonjour !
Je fais depuis quelque temps un projet en java et j'ai un problème. Je déplace un bouton en le glissant avec le souri ! Pendant le déplacement du bouton, les coordonnées du bouton est recueilli dans deux variables (tableau par ce que dans le vrai projet j'utilise beaucoup de bouton) et ces deux variable qu'on utilise pour l'affiché sur la fenêtre. J'utilise une boite de dialogue, avec le menu « Pôle », pour modifier les coordonnées de ce bouton. Ce boite de dialogue comporte deux JTextField, ces deux JTextField c'est pour entrer les valeurs des coordonnées du bouton, quand on ouvre le boite de dialogue les valeurs des deux jTextField est la position actuel du bouton ! Et voici mon problème : quand on modifie les valeurs dans ces champs, en renvoyant les valeurs des deux dans les variables de la coordonnée du bouton, la position de la ne change pas alors que c'est le principal but de cette boite de dialogue.

voici ci-dessous les codes de chaque classe:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class Fenetre extends JFrame{ 
    private static final long serialVersionUID = 1L; 
    private JMenuBar barreMenus; 
    private JMenu Poles; 
    private JMenuItem ModifPole; 
    public Fenetre(){ 
        //fenetre principale 
        this.setTitle("Carte des Pôles et des Zéros interactive"); 
        this.setSize(800,600); 
        this.setResizable(false); 
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        this.setLocationRelativeTo(null); 
        Container cont=  getContentPane(); 
        cont.setLayout(null); 
        //AJOUT DU BARRE DE MENU 
        barreMenus = new JMenuBar(); 
        setJMenuBar(barreMenus); 
         
        //Poles 
        Poles = new JMenu("Pôles"); 
        barreMenus.add(Poles); 
        ModifPole = new JMenuItem("Modifier un Pôle"); 
        ModifPole.setToolTipText("Pour modifier un pôle dans le plan complexe"); 
        Poles.add(ModifPole); 
         
        //POLES****** 
         
        // MODIFIER POLE************************** 
        ModifPole.addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent arg0){ 
                DModifPole zd = new DModifPole(null, "Modification d'un pôle", true); 
            } 
        }); 
         
         
         
        this.setContentPane(new Panneau()); 
        this.setVisible(true); 
        repaint(); 
        } 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
            @SuppressWarnings("unused") 
            Fenetre fen = new Fenetre(); 
    } 
}



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{ 
    public final JButton Pole1=new JButton(""); 
    public final JButton Pole2=new JButton(""); 


    public static int PoleR[]= new int[20]; 
    public static int PoleI[] = new int[20]; 

    public static final int XMIN=35, XMAX=385, YMIN=50, YMAX=400, SIZE=10, DELTA=70; 
    private static final long serialVersionUID = 1L; 
    private int x; 
     public Panneau(){    // INITIALISATION DU VALEUR DE CHAQUE POLE eET DE ZEROs 
            PoleR[1]=254; 
            PoleI[1]=127; 
                    Pole1.setBounds(PoleR[1],PoleI[1],SIZE,SIZE);          
                    Pole1.setBackground(Color.RED); 
                    //DEPLACEMENT DES PÖLE 
                    Pole1.addMouseMotionListener(new MouseMotionListener(){ 
                            private int dx,dy; 
                            public void mouseDragged(MouseEvent e)  
                            { 
                                PoleR[1]=Pole1.getX()+e.getX()-dx; 
                                PoleI[1]=Pole1.getY()+e.getY()-dy; 
                                if (PoleR[1]>=XMIN && PoleR[1]<XMAX && PoleI[1]>=YMIN && PoleI[1]<YMAX) 
                                    Pole1.setLocation(PoleR[1], PoleI[1]); 
                            } 
                            public void mouseMoved(MouseEvent e)  
                            { 
                                dx = e.getX(); 
                                dy = e.getY(); 
                            } 
                        }); 
                    repaint(); 
                    
                        setLayout(null); 
                        add(Pole1); 
                        add(Pole2);     
                } 
     
    public void paintComponent(Graphics g){ 
        super.paintComponent(g); 
             
        x=0; 
        for (int i=1; i<=((15)*5)-4; i++) 
            { 
                g.setColor(Color.gray.brighter()); 
                g.drawLine(35,50+x,385,x+50); 
                g.drawLine(x+35,50,35+x,400); 
                x=x+5; 
            } 
        repaint(); 
    } 
} 




et voici le code de la oite de dialogue:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class DModifPole extends JDialog implements ActionListener{ 
    //FANAMBARANA IREO COMPOSANT REHETRA 
    public static  JTextField TX = new JTextField("0", 10); 
    public static  JTextField TY = new JTextField("0", 10); 
    private JLabel LX = new JLabel("X:"); 
    private JLabel LY = new JLabel("Y:"); 
    private JButton BModifPole = new JButton("OK"); 
    @SuppressWarnings("deprecation") 

    public DModifPole(){} 
    public DModifPole(JFrame parent, String title, boolean modal){ 
        super(parent, title, modal); 
        this.setSize(270,160); 
        //INTERFACE LISTENER 
        //LES jtEXTfIELD****** 
        Container contenu=  getContentPane(); 
        contenu.setLayout(null); 
        TX.setBounds(150,45, 80, 20); 
        TY.setBounds(150,70, 80, 20); 
        contenu.add(TX); 
        contenu.add(TY); 
        /////LES JLABELLLLLL*********** 
        LX.setBounds(80,45, 100, 20); 
        contenu.add((Component) LX); 
        LY.setBounds(80,70, 100, 20); 
        contenu.add((Component) LY); 
        ///LE BNOUTON DE SOUMISSION********** 
        BModifPole.setBounds(95,100,80,25); 
        contenu.add(BModifPole); 
        BModifPole.addActionListener( this); 
        this.setLocationRelativeTo(null); 
        this.setResizable(false); 
        TX.setText(String.valueOf(Panneau.PoleR[1])); 
        TY.setText(String.valueOf(Panneau.PoleI[1])); 
        this.setVisible(true); 
    } 
    public void actionPerformed(ActionEvent e){ 
            Panneau.PoleR[1]=Integer.valueOf(TX.getText()); 
            Panneau.PoleI[1]=Integer.valueOf(TY.getText()); 
            this.dispose(); 
    } 
} 

et je vous remercie en avance!

4 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 juil. 2012 à 15:02
Ton code est mal fait, les objets sont mis à l'arrachée dans l'interface graphique en espérant que ça passe, alors vu que j'ai déjà travaillé à plusieurs reprises sur ton code, j'arrive à m'y retrouver, mais un oeil neuf sera totalement perdu.
Il faut que tu repenses totalement ton code, et au minimum que tu créés une classe pour les boutons qui se déplacent... parce que tes tableaux dupliquent inutilement des informations que l'on peut obtenir directement par les boutons.

Sinon, L'actionPerformed de DModifPole modifie le tableau mais ça ne suffit pas car il fait surtout penser à déplacer le bouton, ce que tu ne fais pas !

Vu ton code actuel, tu dois faire un lien dans ton menu avec l'interface existante, par exemple en passant en paramètre l'objet Panneau :

final Panneau panneau = new Panneau();

Dans Fenetre :

ModifPole.addActionListener(new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent arg0)
    {
         new DModifPole(Fenetre.this, "Modification d'un pôle", true, panneau);
    }
});

this.setContentPane(panneau);

Dans DModifPole (qui n'implémente plus ActionListener)

public DModifPole(Fenetre parent, String title, boolean modal, final Panneau panneau)
{
    ...

    BModifPole.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            Panneau.PoleR[1]=Integer.valueOf(TX.getText());
            Panneau.PoleI[1]=Integer.valueOf(TY.getText());
            panneau.Pole1.setLocation(Panneau.PoleR[1],Panneau.PoleI[1]);
            DModifPole.this.dispose();
        }
    });
  
    ...
}

Remarque : Ton programme rame énormément à cause d'une boucle infinie dans Panneau. Le paintComponent appelle repaint(), qui lui même appelle paintComponent. Conséquence : le quadrillage est constamment en train de se redessiner.
Supprimes donc l'instruction repaint() dans le paintComponent, elle ne sert à rien, et ça évitera au processeur de tourner à fond...
0
Manoa1 Messages postés 8 Date d'inscription mercredi 13 octobre 2010 Statut Membre Dernière intervention 14 juillet 2012
7 juil. 2012 à 19:32
merci infiniment! tu m'as sauvé une nouvezlle fois! que ferais-je sans toi! merci!
0
Manoa1 Messages postés 8 Date d'inscription mercredi 13 octobre 2010 Statut Membre Dernière intervention 14 juillet 2012
9 juil. 2012 à 18:43
j'ai essayé ce que vous m'avez suggéré est il y a encore une erreur sur la classe DMODIFPOLE:

panneau.Pole1.setLocation(Panneau.PoleR[1],Panneau.PoleI[1]);

dans cette instruction, eclipse indique toujours une erreur alors que j'ai suivi a la lettre votre suggestion! j'aimerais que vous jette un coup d'oeil a ce problème! merci d'avance!
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
9 juil. 2012 à 18:58
"il y a encore une erreur sur la classe" : LAQUELLE ???

À chaque fois que tu as un message d'erreur donne le... parce que moi avec les modifications que j'ai décrite hier, je n'en ai aucune, alors comment je la devine ?
0
Manoa1 Messages postés 8 Date d'inscription mercredi 13 octobre 2010 Statut Membre Dernière intervention 14 juillet 2012
10 juil. 2012 à 08:35
sur la classe "DModifPole" sur la ligne"panneau.Pole1.setLocation(Panneau.PoleR[1],Panneau.PoleI[1]);"
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 juil. 2012 à 11:08
Et est-ce que je suis vraiment obligé de jouer aux devinettes pour savoir de quelle erreur il s'agit ?
Au hasard : n'aurais-tu pas oublier de déclarer l'objet panneau comme je l'avais indiqué ?

final Panneau panneau = new Panneau();
0
Manoa1 Messages postés 8 Date d'inscription mercredi 13 octobre 2010 Statut Membre Dernière intervention 14 juillet 2012
10 juil. 2012 à 17:45
mais non! je l'ai déjà inséré! je vais le revoir ce soire et si le problème persiste je vais te l'envoyé demain matin! merci!
0
Manoa1 Messages postés 8 Date d'inscription mercredi 13 octobre 2010 Statut Membre Dernière intervention 14 juillet 2012
14 juil. 2012 à 08:40
je te remercie! le probleme est ien resolue! merci infiniment
0