Déplacement d'un composant dans une fenêtre

Résolu
fatalerror Messages postés 17 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 12 novembre 2017 - 5 sept. 2015 à 21:54
fatalerror Messages postés 17 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 12 novembre 2017 - 6 sept. 2015 à 07:45
Salutations!
Je voudrais déplacer partout dans la fenêtre un composant que j'ai dessiné, seulement ce déplacement n'est pas assez net et je ne sais pas trop quoi faire pour améliorer le résultat. Voici mes bouts de codes:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Point2D;

import javax.swing.JComponent;
import javax.swing.JPanel;

public class Rectangle extends JComponent implements MouseMotionListener {
private final Color couleurCellule;

public Rectangle(final Color c) {
couleurCellule = c;
addMouseMotionListener(this);
}


@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
g.setColor(couleurCellule);
g.fillRect(50, 150, 200, 300);
}


@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
int x = e.getX();
int y = e.getY();
this.setBounds(x, y, 200, 300);
repaint();
//System.out.println("x = "+x+" ; y = "+y);

}

@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
//System.out.println("x = "+x+" ; y = "+y);

}

}


import java.awt.Color;
import javax.swing.JFrame;

public class Fenetre extends JFrame {

private static int largeurFenetre = 900,
hauteurFenetre = 600;

public Fenetre(String titre) {
super(titre);
Rectangle rect = new Rectangle(Color.GRAY);
rect.setBounds(100, 100, 200, 300);
add(rect);


setSize(largeurFenetre, hauteurFenetre);
setLocationRelativeTo(null);
setLayout(null);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String args[]) {
new Fenetre("Test").setVisible(true);
}

}

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
5 sept. 2015 à 22:22
Bonjour,

Pour commencer je te conseilles de séparer Component et Listener dans des classes différentes, pour ne pas mélanger la vue et le contrôleur.

Et pour ton problème, il faut utiliser un MouseListener pour identifier où tu es dans la fenêtre au moment tu cliques la première fois, c'est à partir de cette position que se calcule le déplacement du MouseMotionListener.

import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public final class MouseTranslateListener implements MouseListener, MouseMotionListener {

    private final Point pos;

    // private: use addToComponent(Component) instead
    private MouseTranslateListener() {
        pos = new Point();
    }

    public static void addToComponent(Component comp) {
        MouseTranslateListener listener = new MouseTranslateListener();
        comp.addMouseListener(listener);
        comp.addMouseMotionListener(listener);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        pos.setLocation(e.getX(), e.getY());
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        Component comp = e.getComponent();
        comp.setLocation(comp.getX() + e.getX() - pos.x, comp.getY() + e.getY() - pos.y);
    }

    public void mouseClicked(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mouseMoved(MouseEvent e) {}
}

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JComponent;

class Rectangle extends JComponent {
    private final Color couleurCellule;

    public Rectangle(final Color c) {
        couleurCellule = c;
        MouseTranslateListener.addToComponent(this);
    }

    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        g.setColor(couleurCellule);
        g.fillRect(50, 150, 200, 300);
    }
}
0
fatalerror Messages postés 17 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 12 novembre 2017
6 sept. 2015 à 07:45
Ok! ça roule, Merci!
0
Rejoignez-nous