IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

gérer MouseMotionListener sur plusieurs Rectangles


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut gérer MouseMotionListener sur plusieurs Rectangles
    j'ai dessiné quelques rectangles dans ma JPanel.
    Comment est-ce possible de gérer 'mouseMoved' sur chaque des ces rectangles afin que le pointeur de la souris prenne la forme de petite main ?
    j'ai essayé comme ça:
    SimpleTab:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    public class SimpleTab extends Rectangle {
     
    	protected int xPos;
    	protected int yPos;
    	protected int width;
    	protected int height;
    	protected String title;
     
    	public SimpleTab(int xPos, int yPos, int width, int height, String title) {
    		super(xPos, yPos, width, height);
     
    		this.xPos = xPos;
    		this.yPos = yPos;
    		this.width = width;
    		this.height = height;
    		this.title = title;
     
    	}
     
    	public String getTitle() {
    		return title;
    	}
     
    	public void setTitle(String title) {
    		this.title = title;
    	}
     
    	public int getxPos() {
    		return xPos;
    	}
     
    	public void setxPos(int xPos) {
    		this.xPos = xPos;
    	}
     
    	public int getyPos() {
    		return yPos;
    	}
     
    	public void setyPos(int yPos) {
    		this.yPos = yPos;
    	}
    }
    Panel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    public class Onglets extends JPanel implements MouseListener,
    		MouseMotionListener {
     
    	protected int x = 10;
    	protected int y = 10;
    	protected int h = 30;
    	protected int w = 200;
    	protected int offset = 20;
    	protected List<SimpleTab> rectList = new ArrayList<SimpleTab>();
    	protected String[] titles;
     
    	protected ActionListener actionListener = null;	
     
    	public Onglets(String[] titles) {
    		addMouseListener(this);
    		addMouseMotionListener(this);
    		this.titles = titles;
    		for (String title : titles) {
    			if (title.length() > w) {
    				w = title.length();
    			}
    		}
    		for (String title : titles) {
    			rectList.add(new SimpleTab(x, y, w, h, title));
    			x += w + offset;
    		}		
    	}
     
    	public void addActionListener(ActionListener l) {
    		actionListener = AWTEventMulticaster.add(actionListener, l);
     
    	}
     
    	public void removeActionListener(ActionListener l) {
    		actionListener = AWTEventMulticaster.remove(actionListener, l);
    	}
     
    	@Override
    	public void paintComponent(Graphics g) {
     
    		Graphics2D g2d = (Graphics2D) g;
     
    		g2d.setColor(Color.WHITE);
    		g2d.fillRect(0, 0, getWidth(), getHeight());
    		for (int i = 0; i < rectList.size(); i++) {
    			SimpleTab rectangle = rectList.get(i);
    			g2d.setColor(new Color(96, 96, 96));
    			if (i == 0) {
    				g2d.drawLine(0, rectangle.height + 5, getWidth(),
    						rectangle.height + 5);
    			}
    			g2d.setColor(new Color(240, 240, 240));
    			g2d.fillRoundRect(rectangle.x, rectangle.y, rectangle.width,
    					rectangle.height + 5, 5, 5);
     
    			g2d.setColor(new Color(96, 96, 96));
    			g2d.drawRoundRect(rectangle.x, rectangle.y, rectangle.width,
    					rectangle.height + 5, 5, 5);
    			g2d.drawString(rectangle.getTitle(), rectangle.x + 20,
    					rectangle.y + 20);
     
    			g2d.setColor(new Color(240, 240, 240));
    			g2d.fillRect(0, rectangle.height + 6, getWidth(),
    					rectangle.height + 6);
     
    			g2d.setColor(Color.WHITE);
    			if (i == 0) {
    				g2d.drawLine(0, rectangle.height + 6, rectangle.x + 1,
    						rectangle.height + 6);
    			}
    			g2d.drawLine(rectangle.x + rectangle.width - 1,
    					rectangle.height + 6, getWidth(), rectangle.height + 6);
    			g2d.drawLine(rectangle.x + 1, rectangle.y + 2, rectangle.x + 1,
    					rectangle.height + 6);
    			g2d.drawLine(rectangle.x + rectangle.width - 1, rectangle.y + 2,
    					rectangle.x + rectangle.width - 1, rectangle.height + 6);
    			g2d.drawLine(rectangle.x + 2, rectangle.y + 1, rectangle.x
    					+ rectangle.width - 2, rectangle.y + 1);
    			g2d.drawLine(rectangle.x + rectangle.width - 1, rectangle.y + 2,
    					rectangle.x + rectangle.width - 1, 36);
     
    		}
     
    	}
     
    	public void mouseMoved(MouseEvent e) {
    		Point point = e.getPoint();
    		for (SimpleTab rectangle : rectList) {
     
    			if (rectangle.contains(point)) {
    				setCursor(new Cursor(Cursor.HAND_CURSOR));
    			} else {
    				setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    			}
    		}
     
    	}
     
    	@Override
    	public Dimension getPreferredSize() {
    		return new Dimension(1024, 70);
    	}
     
    	@Override
    	public void mousePressed(MouseEvent e) {
     
    		for (SimpleTab rectangle : rectList) {
    			if (!rectangle.contains(e.getPoint())) {
    				return;
    			}
    		}
     
    		if (actionListener != null) {
    			ActionEvent actionEvent = new ActionEvent(this, Event.ACTION_EVENT,
    					"");
    			actionListener.actionPerformed(actionEvent);
    		}
     
    	}
     
    	public void mouseDragged(MouseEvent e) {
    	}
     
    	public void mouseClicked(MouseEvent e) {
    	}
     
    	public void mouseReleased(MouseEvent e) {
    	}
     
    	public void mouseEntered(MouseEvent e) {
    	}
     
    	public void mouseExited(MouseEvent e) {
    	}
     
    	public List<SimpleTab> getRectList() {
    		return rectList;
    	}
     
    	public void setRectList(List<SimpleTab> rectList) {
    		this.rectList = rectList;
    	}
    }
    Main class:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public class Main {
     
    	public static void main(String[] args) {
    		javax.swing.SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				createAndShowGUI();
    			}
    		});
    	}
     
    	private static void createAndShowGUI() {		
    		Onglets onglets = new Onglets(new String[] {"Tab number 1", "Tab 2"/*, "A Very long tab pane title"*/});
            onglets.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Tabbed pane clicked !!");
                    return;
                }
            });        
     
            JFrame frame = new JFrame("Custom pane with tabs");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(onglets);
            frame.pack();
            frame.setVisible(true);
     
     
    		frame.pack();
    		frame.setVisible(true);
    	}
     
    }
    Mais la méthode ne détecte que le dernier Rectangle. En plus, le cllique sur la Tab dessiné ne fonctionne pas... Quelqu'un a 1 idée ? Merci.

  2. #2
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    C'est plutôt logique, a chaque fois que tu passe dans la boucle, tu écrases le résultat de l'itération précédente.

    Il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	public void mouseMoved(MouseEvent e) {
    		Point point = e.getPoint();
    		boolean contains = false;
     
    		for (SimpleTab rectangle : rectList) {
    			if (rectangle.contains(point)) {
    				contains = true;
    				break;
    			} 
    		}
     
     		if(contains){setCursor(setCursor(new Cursor(Cursor.HAND_CURSOR));}
     		else {setCursor(new Cursor(Cursor.DEFAULT_CURSOR));}
     
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    	@Override
    	public void mousePressed(MouseEvent e) {
    		boolean contains = false;
     
    		for (SimpleTab rectangle : rectList) {
    			if (rectangle.contains(point)) {
    				contains = true;
    				break;
    			} 
    		}
     
    		if (contains && actionListener != null) {
    			ActionEvent actionEvent = new ActionEvent(this, Event.ACTION_EVENT,"");
    			actionListener.actionPerformed(actionEvent);
    		}
     
    	}
    A noter que pour une opération de ce genre, il serait beaucoup plus pratique de passer par un objet GeneralPath par exemple.

  3. #3
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    Un GRAND merci, ça marche. Peut-tu m'explique ce que c'est GeneralPath et dans quelles situations on l'utilise?

    Merci

  4. #4
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    ca y est! j'ai trouvé un tuto sur GeneralPath:

    http://www.java2s.com/Code/Java/2D-G...eneralPath.htm
    Encore Merci!!!!

  5. #5
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par Javix Voir le message
    Un GRAND merci, ça marche. Peut-tu m'explique ce que c'est GeneralPath et dans quelles situations on l'utilise?

    Merci
    C'est une forme 2D. En fait, dans ton cas, tu peux ajouter tous tes rectangles dans ton GeneralPath et ensuite, tu n'as plus qu'à faire un path.contains(point) au lieu de parcourir toi-même tes rectangles.

    Quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Path2D path = new GeneralPath();
     
            for (Rectangle rect : rectList) {
                path.append(rect, false);
            }
    Ensuite, dans tes méthodes, tu fais simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	public void mouseMoved(MouseEvent e) {
     		if(path.contains(e.getPoint())){setCursor(setCursor(new Cursor(Cursor.HAND_CURSOR));}
     		else {setCursor(new Cursor(Cursor.DEFAULT_CURSOR));}
     
    	}
     
    	@Override
    	public void mousePressed(MouseEvent e) {
    		if (path.contains(e.getPoint()) && actionListener != null) {
    			ActionEvent actionEvent = new ActionEvent(this, Event.ACTION_EVENT,"");
    			actionListener.actionPerformed(actionEvent);
    		}
     
    	}
    Simple, non ?

  6. #6
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    SUPER!!!! Jamais fait un truc pareil. J'adore ce métier où on apprend tous les jours, et bien dommage que cette partie de Java est presque non expliquée dans tous les bouquins Java.

  7. #7
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    j'ai rajouté GeneralPath et ça marche!
    Dernière petite question: comment est-ce possible de distinguer la Tab sur laquelle on a cliqué pour pouvoir par après afficher tel ou tel Panel ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008R2] Répéter un rectangle sur plusieurs pages
    Par dragohn dans le forum SSRS
    Réponses: 2
    Dernier message: 21/04/2012, 18h16
  2. ToolTips sur plusieurs rectangles
    Par BunnyFly dans le forum 2D
    Réponses: 1
    Dernier message: 18/04/2011, 00h00
  3. Réponses: 0
    Dernier message: 17/02/2009, 15h37
  4. Afficher plusieurs rectangles sur la même image
    Par hello05 dans le forum Images
    Réponses: 5
    Dernier message: 15/04/2008, 12h48
  5. [CR] Groupement dynamique sur plusieurs champs paramètrés
    Par CDRIK dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 07/06/2004, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo