2009-09-27 13 views
0

J'ai développé un programme pour dessiner des triangles polygones. Les triangles ont été dessinés en utilisant la souris. Les coordonnées des triangles ont été stockées dans une liste de tableaux. Chaque fois que le curseur de la souris, survolez les triangles dessinés existants (dans la zone du triangle), le curseur de la souris doit se tourner vers "CROSSHAIR_CURSOR", mais cela ne s'est pas produit. Aide :-(souris déplacée curseur -crosshair

... 
    public class DrawingBoardWithMatrix extends JFrame { 
     public static void main(String[] args) { 
     new DrawingBoardWithMatrix(); 
     } 

    public DrawingBoardWithMatrix(){ 
     this.add(new PaintSurface(), BorderLayout.CENTER); 
     ... 
    } 

    private class PaintSurface extends JComponent { 
     java.util.List<Polygon> triangles = new LinkedList<Polygon>(); 
     Point startDrag, endDrag, midPoint; 
     Polygon triangle; 

     public PaintSurface() { 
     ... 
     this.addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      startDrag = new Point(e.getX(), e.getY()); 
      endDrag = startDrag; 
      repaint(); 
     }//end mousePressed 

     public void mouseReleased(MouseEvent e) { 
      if (startDrag.x > endDrag.x) 
      midPoint = new Point((endDrag.x +(Math.abs(startDrag.x - endDrag.x)/2)),e.getY()); 
      else 
      midPoint = new Point((endDrag.x -(Math.abs(startDrag.x - endDrag.x)/2)),e.getY()); 

      int[] xs = { startDrag.x, endDrag.x, midPoint.x }; 
      int[] ys = { startDrag.y, startDrag.y, midPoint.y };  
      triangles.add(new Polygon(xs, ys, 3));  

      startDrag = null; 
      endDrag = null; 
      repaint(); 
     }//end mouseReleased    
     });//end addMouseListener 

     this.addMouseMotionListener(new MouseMotionAdapter() { 
     public void mouseDragged(MouseEvent e) { 
      endDrag = new Point(e.getX(), e.getY()); 
      repaint(); 
     }//end mouseDragged  
     });//end this.addMouseMotionListener 
    }//end paintSurface  

    //THIS CODE DOESNT WORK - AND I AM STUCK :-(  
    public void mouseMoved(MouseEvent e) { 
     startDrag = new Point(e.getX(), e.getY()); 
     if (triangles.contains(startDrag)) 
     setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 
     else 
     setCursor(Cursor.getDefaultCursor()); 
    }// end mouseMoved 

    private void paintBackground(Graphics2D g2){ 
    ... 
    } 

    public void paint(Graphics g) { 
    ... 
    } 

    }//end private class PaintSurface 

    }//end public class DrawingBoardMatrix 

Répondre

2

Voyez-vous la méthode invoquée mouseMoved du tout? La façon dont cela est écrit, la méthode mouseMoved est membre de PaintSurface, mais PaintSurface est pas MouseMotionListener. De mise en œuvre « MouseMotionListener » forcera à mettre en œuvre mouseMoved et mouseDragged une fois que vous avez fait cela, vous pouvez ajouter votre PaintSurface à lui-même comme un MouseMotionListener Sinon, vous pouvez déplacer la méthode mouseMoved dans la MouseMotionAdapter classe anonyme que vous avez déjà défini:..

//paintSurface constructor 
.... 
this.addMouseMotionListener(new MouseMotionAdapter() { 
    public void mouseDragged(MouseEvent e) { 
     endDrag = new Point(e.getX(), e.getY()); 
     repaint(); 
    }//end mouseDragged  

    //TRY THIS CODE :-)  
    public void mouseMoved(MouseEvent e) { 
     startDrag = new Point(e.getX(), e.getY()); 
     if (triangles.contains(startDrag)) 
     setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 
     else 
     setCursor(Cursor.getDefaultCursor()); 
    }// end mouseMoved 
});//end this.addMouseMotionListener 
}//end paintSurface  

EDIT (en réponse à votre commentaire):

Il semblerait que votre if (triangles.contains(startDrag)) conditionnelle dépend de la List<Polygon> trouver un Point qui se considère comme égal au passé dans Point. Pour autant que je peux dire à partir de regarder le code dans Polygon (il ne remplace pas la méthode equals, donc il prend l'implémentation de Object), vous ne serez pas en mesure d'effectuer ce test "avec succès". Vous devrez parcourir sur votre Polygon s dans votre collection triangles et effectuer une opération contains sur chacun d'eux.

EDIT 2:

Vous êtes probablement trop penser cela un peu. Afin de mettre en œuvre la suggestion « pour itérer sur vos Polygon s dans votre collection triangles ... » vous pouvez faire quelque chose comme ce qui suit:

public void mouseMoved(MouseEvent e) { 
     startDrag = new Point(e.getX(), e.getY()); 
     Cursor cursor = Cursor.getDefaultCursor(); 
     //you have a List<Polygon>, so you can use this enhanced for loop 
     for (Polygon p : triangles) { 
     if (p.contains(startDrag)) {//Polygon has a 'contains(Point)' method 
      cursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); 
      break; //you've found a hit, break from the loop 
     } 
     } 
     setCursor(cursor); 
}// end mouseMoved 

Vous pouvez également envisager ne pas fixer le curseur à chaque mouvement de la souris. Pour cela, vous pouvez mettre un test pour vérifier le type de curseur et le type du curseur que votre mouvement de la souris est l'intention de créer, et mettre uniquement s'il y a un changement:

if (cursor.getType() != getCursor().getType()) { 
     setCursor(cursor); 
    } 
+0

Merci AKF . J'ai changé le placement de la méthode mouseMoved dans le addMouseMotionListener, mais il ne fonctionne toujours pas :-( – Jessy

+0

Jessy, j'ai mis à jour ma réponse, jetez un coup d'oeil – akf

+0

Merci encore akf Mais ça me semble compliqué. pour modifier le code – Jessy

Questions connexes