Deplacement d'un Bouton dan un JPanel
Résolu
manoa21
Messages postés
9
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
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:
et voici le code de JPanel
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); } }
A voir également:
- Deplacement d'un Bouton dan un JPanel
- Comment faire une capture d'écran sur un samsung sans bouton ? - Guide
- Mes deplacement - Guide
- Comment debloquer un bouton enfoncé - Forum iPhone
- Bouton volume - enfoncé impossible d'utiliser mon téléphone - Forum Samsung
- Diagnostic bouton photo - Accueil - Outils
1 réponse
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.
La confiance n'exclut pas le contrôle
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