Déplacement d'un composant dans une fenêtre [Résolu]

Messages postés
18
Date d'inscription
dimanche 24 mars 2013
Dernière intervention
12 novembre 2017
- - Dernière réponse : fatalerror
Messages postés
18
Date d'inscription
dimanche 24 mars 2013
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);
}

}
Afficher la suite 

Votre réponse

1 réponse

Messages postés
15866
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 décembre 2018
0
Merci
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);
    }
}
fatalerror
Messages postés
18
Date d'inscription
dimanche 24 mars 2013
Dernière intervention
12 novembre 2017
-
Ok! ça roule, Merci!
Commenter la réponse de KX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.