这个问题已被别人问过,但我没有得到明确答案。
我创建了一个Line类和paint方法来绘制一条线。
我想知道如何在绘制后访问该行。我有两个标记线的终点的JLabel。所以我可以使用它们调整行的大小,但我无法选择该行。
我还尝试在该行周围创建一个面板并添加了mouseListener,但效率不高。
有人能提出更明智的建议吗?
这是行
的构造函数 public Line(Point a,Point b,JLabel l1,JLabel l2){
this(a,b);
this.l1=l1;
this.l2=l2;
this.addMouseListener(this);
}
答案 0 :(得分:2)
创建Line2D
个对象。然后使用BasicStroke
并定义所需的线条粗细。
使用方法
public Shape createStrokedShape(Shape s)
获取Line的描边形状。
使用行contains()
的{{1}}方法来检查点击点是否在线。
答案 1 :(得分:2)
@StanislavL有正确的想法使用实现Shape
的类的contains()
方法,但@Catalina观察到它Line2D
总是错误的。相反,使用具有非空边界的Shape
渲染端点。例如,GraphPanel
使用Rectangle
来允许拖动每个端点。
答案 2 :(得分:0)
从您发布的几行中,我无法确定您实际拥有的内容。线条的选择不是准备好的。你需要实现它,但它很容易。 无论如何,你应该保持线的坐标并检查鼠标监听器,以便在线上点击鼠标。
public void mousePressed(MouseEvent ev)
{
double TOLERANCE = 5; // Small tolerance measured in pixels
if (ev.getClickCount() == 1)
{
Point cursor = ev.getPoint();
if (Math.abs(cursor.x - a.x) < TOLERANCE &&
Math.abs(cursor.y - a.y) < TOLERANCE)
{
// Clicked on the first point
}
else if (Math.abs(cursor.x - b.x) < TOLERANCE &&
Math.abs(cursor.y - b.y) < TOLERANCE)
{
// Clicked on the second point
}
}
}
答案 3 :(得分:0)
您可以从JComponent或一个适当的后继类(即JButton)扩展您的Line
然后覆盖contains函数;
Shape shape;
public boolean contains(int x, int y) {
// If the button has changed size, make a new shape object.
if (shape == null || !shape.getBounds().equals(getBounds())) {
shape = new Line2D.Float(a.x, a.y, b.x, b.y);
}
return shape.contains(x, y);
}
注意:Line2D.Float构造函数参数可能是无序的,我是从内存中写的。