Bonjour,
je suis en train de réaliser un petit exercice ou j'ai une grille (réalisée avec GridLayout) de 10x10 cases et lorsque je passe sur chacune d'elle, je dois afficher leur coordonnées.
Pour celai j'ai créé un GridLayout avec 10x10 JPanels à l'intérieur. Cela fonctionne mais je ne peux pas vraiment connaitre leur coordonnées au passage de la souris.
J'ai donc créé une petite classe héritant de JPanel avec les coordonnées en attributs.
Voici la classe :
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
| package ex;
import javax.swing.JPanel;
/**
* Classe représentant un JPanel avec 2 paramètres en plus : les coordonnées correspondant à la position du JPanel dans le damier
* @author aurelien
*/
public class CheckerboardCase extends JPanel {
private int cx, cy;
public CheckerboardCase(int cx, int cy) {
this.cx = cx;
this.cy = cy;
}
public int getCx() {
return this.cx;
}
public int getCy() {
return this.cy;
}
} |
Je n'ai pas mis x et y parce que JPanel a déjà ces attributs donc faire des getters par dessus fausse tout.
Et voici le programme principal :
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
| package ex;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class Window extends JFrame implements MouseListener {
int cbWidth = 10, cbHeight = 10; // Tailles par défaut de la grille
JPanel pCheckerboard = new JPanel();
JLabel lbl1 = new JLabel("Case survolée : ");
JLabel lInfos = new JLabel("aucune");
public Window4() {
super("Ma fenêtre");
/*
* Création de la grille
*/
this.pCheckerboard.setLayout(new GridLayout(this.cbWidth, this.cbHeight));
for (int i = 0; i < this.cbWidth; i++) {
for (int j = 0; j < this.cbHeight; j++) {
CheckerboardCase cbCase = new CheckerboardCase(i, j);
cbCase.setBorder(BorderFactory.createLineBorder(Color.black));
cbCase.addMouseListener(this);
this.pCheckerboard.add(cbCase);
}
}
/*
* Informations sur la case survolée
*/
this.lInfos.setToolTipText("Coordonnées de la case survolée");
JPanel pInfos = new JPanel();
pInfos.add(this.lbl1);
pInfos.add(this.lInfos);
this.add(pCheckerboard, BorderLayout.CENTER);
this.add(pInfos, BorderLayout.SOUTH);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void mouseEntered(MouseEvent me) {
// récupération des coordonnées de la case survolée + affichage
int x = ...;
int y = ...;
this.lInfos.setText("[" + Integer.toString(x) + ", " + Integer.toString(y) + "]");
this.lbl1.setVisible(true);
this.lInfos.setVisible(true);
}
public void mouseExited(MouseEvent me) {
this.lbl1.setVisible(false);
this.lInfos.setVisible(false);
}
public void mouseClicked(MouseEvent me) {}
public void mousePressed(MouseEvent me) {}
public void mouseReleased(MouseEvent me) {}
public static void main(String[] args) {
Window window = new Window();
}
} |
Le problème se trouve au niveau de la fonction mouseEntered() où je souhaite récupérer les coordonnées de la case avec les méthodes de la classe que j'ai écrite : getCx() et getCy().
En faisant :
me.getComponent().getClass().getName();
j'arrive à récupérer le nom de ma classe mais si je fais :
me.getComponent().getClass().getCx();
par exemple, il me dit :
cannot find symbol
symbol: method getCx()
location: class java.lang.Class<<capture#1 of ? extends java.awt.Component>
J'ai essayé de regarder les différentes méthodes proposées à partir de MouseEvent et de me.getComponents() mais je ne comprends pas comment accéder aux méthodes de ma classe.
Merci d'avance
Partager