So habe ich einige Probleme dabei. Grundsätzlich zeichnete ich zuvor mit Graphics2D und GeneralPath einige Liniensegmente auf einem JPanel, und nun möchte ich das Graphics2D/GeneralPath-Objekt abrufen, wenn ich es auf dem JPanel anklicke, kann ich das trotzdem machen?Wählen Sie Grafikkomponenten, wenn Sie auf ein JPanel klicken
-1
A
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;
}
}
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. –
@LinxuanMichaelYang, sieht aus wie 'Shape.contains (...)' funktioniert nicht auf Zeilen. Siehe Bearbeiten. – camickr
Leider funktioniert das immer noch nicht, thx sowieso –