Так что у меня есть некоторые проблемы с этим. В основном, я ранее рисовал некоторые сегменты линии на JPanel, используя Graphics2D и GeneralPath, и теперь я хочу получить объект Graphics2D/GeneralPath, когда я нажимаю на него на JPanel, есть ли в этом случае я могу это сделать?Выберите графические компоненты при нажатии на JPanel
-1
A
ответ
1
Я хочу, чтобы получить объект Graphics2D/GeneralPath, когда я нажимаю на него на JPanel
Вы должны держать ArrayList
в Shape
объект, который вы рисуете. Затем в MouseListener вы можете получить точку мыши и использовать метод Shape.contains(...)
, чтобы определить, был ли щелчок мыши на Shape
, который вы нарисовали.
Draw On Component
пример из Custom Painting Approaches демонстрирует концепцию покраски объекта из массива ArrayList, чтобы вы начали.
Edit:
Метод Shape.contains(...)
не работает для строк.
Ниже приведена краткая попытка написать метод contains (...) для объекта Line2D и Point. Не уверен, насколько точно это будет в реальной жизни.
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;
}
}
Это не работает для меня прямо сейчас, потому что независимо от того, где я щелкнул, координаты точки всегда являются целыми значениями, и метод contains() всегда возвращает false для меня. –
@LinxuanMichaelYang, выглядит как 'Shape.contains (...)' не работает в строках. См. Править. – camickr
очень грустно это все еще не работает, thx anyways –