2016-07-11 13 views

Antwort

1

Ich möchte die Graphics2D/GeneralPath Objekt abzurufen, wenn ich auf dem JPanel darauf klicken

Sie benötigen einen ArrayList von Shape Objekt zu halten, die Sie zeichnen. Dann können Sie im MouseListener den Mauszeiger ermitteln und mit der Methode Shape.contains(...) feststellen, ob der Mausklick auf eine von Ihnen gezeichnete Shape erfolgte.

Das Draw On Component Beispiel von Custom Painting Approaches zeigt das Konzept des Zeichnens eines Objekts aus einer ArrayList, um loszulegen.

Edit:

Die Shape.contains(...) Methode funktioniert nicht für Linien.

Hier ist ein kurzer Versuch, eine contains (...) -Methode für ein Line2D-Objekt und einen Point zu schreiben. Nicht sicher, wie genau es im wirklichen Leben sein wird.

import java.awt.*; 
import java.awt.geom.*; 

class LineContains 
{ 
    public static void main(String...args) 
    { 
     Point point = new Point(10, 19); 
     Line2D.Double line = new Line2D.Double(0, 0, 10, 20); 
     boolean result = LineContains.contains(line, point); 
     System.out.println(result); 
    } 

    static boolean contains(Line2D line, Point point) 
    { 
     double[] location = new double[6]; 

     PathIterator pi = line.getPathIterator(null); 
     pi.currentSegment(location); 
     int x1 = (int)location[0]; 
     int y1 = (int)location[1]; 

     pi.next(); 
     pi.currentSegment(location); 
     int x2 = (int)location[0]; 
     int y2 = (int)location[1]; 

     double xDelta = x2 - x1; 
     double yDelta = y2 - y1; 

     double iterations = Math.max(Math.abs(xDelta), Math.abs(yDelta)); 
     double xMultiplier = xDelta/iterations; 
     double yMultiplier = yDelta/iterations; 

     for (int i = 0; i < iterations; i ++) 
     { 
      int x = (int)Math.round(x1 + (i * xMultiplier)); 
      int y = (int)Math.round(y1 + (i * yMultiplier)); 
      //System.out.println(x + " : " + y); 

      if (x == point.x 
      && y == point.y) 
       return true; 
     } 

     return false; 
    } 
} 
+0

Es funktioniert momentan nicht für mich, egal wo ich geklickt habe, die Punktkoordinaten sind immer ganzzahlige Werte und die contains() Methode gibt immer falsch für mich zurück. –

+0

@LinxuanMichaelYang, sieht aus wie 'Shape.contains (...)' funktioniert nicht auf Zeilen. Siehe Bearbeiten. – camickr

+0

Leider funktioniert das immer noch nicht, thx sowieso –

Verwandte Themen