Je me retrouve un peu dans une impasse. En fait , j'ai des lignes dont les coordonnées des extrémités sont stockées dans un Vecteur. Je dessine ces lignes en Line2D avec une boucle for. Le souci est que je souhaiterais pouvoir cliquer sur une ligne et pouvoir changer la couleur par exemple. J'ai du mal à trouver où placer le listener. J'ai essayé de créer une classe pour les lignes avec le listener dedans . j'ai essayé d'ajouter le listener à l'intérieur de la boucle dans la méthode paint lors du dessin . j'ai essayé de le placer sur le panel dans lequel je dessine mais aucun résultat.
Est-ce que quelqu'un aurait une petite idée sur le sujet ?
Tu peux stocker toutes tes lignes dans une liste. Lorsque l’utilisateur clique, tu parcoures cette liste et tu regardes si le point cliqué (x,y) est sur ton segment. Si c'est le cas, tu sélectionnes cette ligne.
Merci javatar pour ta réponse . En fait , mes lignes sont déjà dans une liste sous forme de classe personnalisée . Je veux dire que j'ai une classe où les coordonnées sont stockées . J'ai préparé le listener pour le click . Donc j'ai rédigé le test mais je ne sais pas comment l'intégrer dans le parcours de la liste . Tu pourrais m'orienter s'il te plait ?
Voilà donc comment j'ai procédé. J'ai créé une nouvelle classe , j'y ai rajouté un mouseadapter dans où j'ai implémenté mouseClicked et mouseMoved (j'ai besoin aussi de changer le curseur que je survole une ligne).
Voilà ma classe
public class wallsPanel extends JPanel
{
//wall est une classe que j'ai cree qui contient
//un point initial et un point final (segment)
private Vector<wall> panelWalls;
// constructeur
wallsPanel(Vector<wall> walls)
{
panelWalls = walls;
addMouseListener(new MouseAdapter() {
private int x,y;
public void mouseClicked(MouseEvent me)
{
x= me.getX();
y = me.getY();
for(int i=0; i<walls.size();i++)
{
Point pi = walls.get(i).getPInitial();
Point pf = walls.get(i).getPFinal();
Line2D wall = new Line2D.Double(pi, pf);
Line2D mouse = new Line2D.Double(x, y, x, y);
if (wall.intersectsLine(mouse))
{
System.out.println("wall clicked");
}
}
}
public void mouseMoved(MouseEvent me)
{
x= me.getX();
y = me.getY();
for(int i=0; i<walls.size();i++)
{
Point pi = walls.get(i).getPInitial();
Point pf = walls.get(i).getPFinal();
Line2D wall = new Line2D.Double(pi, pf);
Line2D mouse = new Line2D.Double(x, y, x, y);
if (wall.intersectsLine(mouse))
{
System.out.println("here is a wall");
setCursor(new Cursor(Cursor.HAND_CURSOR));
}
else
{
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
}
});
}
et j'ai rajouté par la suite le paintcomponent
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
for(int i=0;i<panelWalls.size();i++)
{
Point p1 = panelWalls.get(i).getPInitial();
Point p2 = panelWalls.get(i).getPFinal();
g2.setColor(Color.black);
g2.setStroke(new BasicStroke(10));
g2.drawLine((int)p1.getX(),(int)p1.getY(),(int)p2.getX(),(int)p2.getY());
}
}
et dans le programme principal
JFrame wallsEdit = new JFrame("Walls");
wallsPanel planP = new wallsPanel(walls);
wallsEdit.add(planP); wallsEdit.setAlwaysOnTop(true);
wallsEdit.setVisible(true);
wallsEdit.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
le résultat est que le curseur ne change pas et quand je clique sur une ligne un seul clic est détecté et en suite plus rien.
petite remarque concernant contains , cette méthode pour Line2D retourne toujorus false .
pour l'instant j'essaie de faire marcher mon programme sur la ligne et par la suite je vais gérer le fait que les lignes sont trop fines et que je dois detecter les clics sur un périmètre donné.
J'ai fait une légère modification. Pour tester si le curseur est sur la ligne j'utilise plutôt la distance. Ça marche pour le clic à présent mais pour le mouse moved ça ne marche toujours pas . Une idée ? Merci d'avance
Pour le mouse moved il faut ajouter un mouse motion listener sur ton composant, comme expliqué ici : https://docs.oracle.com/javase/tutorial/uiswing/events/mousemotionlistener.html
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
CTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr
CTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr
CTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr