绘制后访问一条线

时间:2012-03-19 09:25:17

标签: java swing mouselistener

这个问题已被别人问过,但我没有得到明确答案。

我创建了一个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);
 }

4 个答案:

答案 0 :(得分:2)

创建Line2D个对象。然后使用BasicStroke并定义所需的线条粗细。 使用方法

public Shape createStrokedShape(Shape s)

获取Line的描边形状。 使用行contains()的{​​{1}}方法来检查点击点是否在线。

答案 1 :(得分:2)

@StanislavL有正确的想法使用实现Shape的类的contains()方法,但@Catalina观察到它Line2D总是错误的。相反,使用具有非空边界的Shape渲染端点。例如,GraphPanel使用Rectangle来允许拖动每个端点。

GraphPanel

答案 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构造函数参数可能是无序的,我是从内存中写的。