Ecouter un objet quelconque

Résolu/Fermé
arthurg95 Messages postés 2399 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 - Modifié par arthurg95 le 9/05/2013 à 15:20
arthurg95 Messages postés 2399 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 - 9 mai 2013 à 20:54
Arthur
Étudiant
Inscription : mai 2013
Messages : 4

Points : 0
Ecouter un objet quelconque
Bonjour, je vous présente rapidement mon projet avant d'entrer dans le vif du sujet :
En gros c'est refaire un paint, très grossièrement bien sur, donc j'ai une classe Dessin, qui est mon JPanel, qui contient une liste de forme à dessiner, une classe Fenetre, qui est ma JFrame, une classe Forme, chaque forme est définie par un tableau de point à "relier" pour les dessin, donc avec g.drawPolygon, ...
Et chaque point est aussi dessiné pour être visible et donc cliquable, il est dessiné par un drawPolygon, que j'ai défini, par une zone de 6 pixel de coté autour du point.

Mon problème est que je voudrais écouter cette partie du point qui est dessiné, pour pouvoir déplacer le point avec la souris.
Mais lorsque je j'implémente un mouseListener, tout le JPanel est réceptif aux action, donc peut-importe où je clique "Test" s'affiche (c'était un SOP que j'avais mit pour tester hein )

Une capture pour vous montrer à quoi ressemble ma fenêtre :

http://informatiquelegal.free.fr/Fenetre.PNG

Tout est dit, mais comme personne n'écoute il faut toujours répéter

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
9 mai 2013 à 15:53
Je vois plusieurs manières de faire, en voici deux :

1) Tu stockes chaque point de tes polygones dans une Collection que tu relis à chaque fois pour faire tes drawPolygon dans ton paint(), et lorsque tu as ton mouseListener sur ton JPanel, tu te sers de l'ActionEvent pour déterminer quel point de ta Collection tu as appuyé, puis te le modifies directement dans la Collection en fonction de son déplacement, ce qui entrainera aussi la modification du polygone dessiné.

2) Pour chaque point de ton polygone tu créées un Component (tout petit, juste la taille de ton cercle) que tu ajoutes à ton JPanel, c'est alors sur ces petits objets qu'il faudra ajouter des MouseListener, ils détecteront tout seul que c'est sur eux que tu appuies, et tu les déplaceras également en utilsant l'ActionEvent. Concernant tes drawPolygon il suffira alors de regarder ce que contient le JPanel pour tous les retrouver et les relier les uns aux autres.
0
arthurg95 Messages postés 2399 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 341
Modifié par arthurg95 le 9/05/2013 à 16:56
Merci de ta réponse rapide !
Je préfère la seconde proposition je pense !

Puis-je simplement extends mes points en JComponent implements ActionListener?
Et si je fais comme ceci, dans le JPanel : addActionListener(le point) c'est ça ?
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 mai 2013 à 19:23
Tu peux même faire directement un extends java.awt.Component. Par contre, je trouve en général que c'est une meilleure idée d'ajouter un ou plusieurs Listener dans le constructeur plutôt que d'implémenter les interface.

Exemple (il y a un petit bug avec le déplacement du point, mais si je retrouve comment faire je te le dirais)

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

import javax.swing.JFrame;
import javax.swing.JRadioButton;

public class SommetDeplacable extends Component
{    
    private final transient Point tmp = new Point();
    
    private class Mouse implements MouseListener
    {
        @Override
        public void mouseClicked(MouseEvent e)
        {
            tmp.setLocation(e.getX(),e.getY());
        }

        @Override
        public void mouseEntered(MouseEvent e)
        {
        }

        @Override
        public void mouseExited(MouseEvent e)
        {
        }

        @Override
        public void mousePressed(MouseEvent e)
        {
        }

        @Override
        public void mouseReleased(MouseEvent e)
        {
        }
    }
    
    private class MouseMotion implements MouseMotionListener
    {
        @Override
        public void mouseDragged(MouseEvent e)
        {
            Point pos = SommetDeplacable.this.getLocation();
            
            SommetDeplacable.this.setLocation
            (
                pos.x + e.getX() - tmp.x,
                pos.y + e.getY() - tmp.y
            );
        }

        @Override
        public void mouseMoved(MouseEvent e)
        {
        }
    }

    public SommetDeplacable(int x, int y)
    {
        setLocation(x, y);
        setSize(20,20);
        addMouseListener(new Mouse());
        addMouseMotionListener(new MouseMotion());
    }
    
    @Override
    public void paint(Graphics g)
    {
        g.setColor(Color.BLACK);
        g.fillOval(0,0,getWidth(),getHeight());
    }
    
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setLayout(null);
        frame.setSize(500,500);
        frame.add(new SommetDeplacable(100,100));
        frame.add(new SommetDeplacable(200,200));
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
0
arthurg95 Messages postés 2399 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 341
9 mai 2013 à 20:54
J'ai fait comme ça finalement :

1
2
3
4
5
6
7
8
9
10
11
12

public class Points extends JPanel {

int x,y;
public Points(int x,int y,JPanel panel) {
this.x = x;
this.y = y;
addMouseMotionListener(panel);
setBackground(Color.black);
setBounds(x-2,y-2,5,5);//en supposant que ton point face 5 sur 5
}
}
ensuite dans panel qui devra donc implementer MouseMotionListener tu utilises mouseDragged() pour bouger tes points

Code :Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10

public void mouseMoved(MouseEvent e) {

}

public void mouseDragged(MouseEvent e) {
Points p = (Points)e.getSource();
p.setLocation(e.getX(),e.getY());
//pas besoin de repaint car setLocation induit automatiquement un repaint
}
0