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

fatalerror 18 Messages postés dimanche 24 mars 2013Date d'inscription 12 novembre 2017 Dernière intervention - 5 sept. 2015 à 21:54 - Dernière réponse : fatalerror 18 Messages postés dimanche 24 mars 2013Date d'inscription 12 novembre 2017 Dernière intervention
- 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 

2 réponses

Répondre au sujet
KX 15089 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 14 décembre 2017 Dernière intervention - 5 sept. 2015 à 22:22
0
Utile
1
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 18 Messages postés dimanche 24 mars 2013Date d'inscription 12 novembre 2017 Dernière intervention - 6 sept. 2015 à 07:45
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.