Partage
  • Partager sur Facebook
  • Partager sur Twitter

Line2D mouseListener

    22 mai 2018 à 9:53:51

    Bonjour à tous,

    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 ?

    Merci beaucoup

    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2018 à 5:29:13

      Bonjour,

      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.

      • Partager sur Facebook
      • Partager sur Twitter

      cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

        25 mai 2018 à 11:05:43

        Bonjour 

        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 ?

        • Partager sur Facebook
        • Partager sur Twitter
          26 mai 2018 à 18:52:28

          - Ajoutes ton listener sur le composant dans lequel tu dessines tes lignes : this / tonComposant . addMouseListener(tonMouseListener)

          - Dans ton listener, tu définis la méthode mouseClicked dans lequel tu parcoures la liste

          - Pour chaque élément, tu regardes si le point donné par le MouseEvent est sur la ligne. Tu as la méthode Line2D#contains pour cela

          - Si oui, l'élément est sélectionné et tu peux terminer ta boucle

          • Partager sur Facebook
          • Partager sur Twitter

          cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

            31 mai 2018 à 13:17:13

            Merci pour ta réponse . Je teste et je te tiens au courant .
            • Partager sur Facebook
            • Partager sur Twitter
              1 juin 2018 à 13:31:09

              Salut,

              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é.

              merci encore pour le coup de main

              • Partager sur Facebook
              • Partager sur Twitter
                6 juin 2018 à 9:41:53

                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
                • Partager sur Facebook
                • Partager sur Twitter
                  7 juin 2018 à 8:47:12

                  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
                  • Partager sur Facebook
                  • Partager sur Twitter

                  cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

                  Line2D mouseListener

                  × 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.
                  • Editeur
                  • Markdown