如何将鼠标侦听器添加到使用Graphics.drawLine()绘制的线条

时间:2015-05-14 18:02:23

标签: java swing

正如标题所说,我希望能够右键单击我在Jpanel上绘制的线条。由于这些行不是组件,我不能简单地将MouseListener添加到它们。目前,我正在使用以下代码在Jpanel上绘制线条:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    for (UserDrawnLine line : userDrawnLines) {
        g.setColor(new Color(line.colorRValue,line.colorGValue, line.colorBValue));
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(line.thickness));
        g.drawLine(line.startPointX, line.startPointY, line.endPointX, line.endPointY);
    }
}

这是我的UserDrawnLine类:

public class UserDrawnLine {
    public int startPointX;
    public int startPointY;
    public int endPointX;
    public int endPointY;
    public int colorRValue;
    public int colorGValue;
    public int colorBValue;
    public float thickness;



    public UserDrawnLine(int startPointX, int startPointY, int endPointX, int endPointY, int colorRValue,int colorGValue,int colorBValue, float thickness) {
        this.startPointX = startPointX;
        this.startPointY = startPointY;
        this.endPointX = endPointX;
        this.endPointY = endPointY;
        this.colorRValue=colorRValue;
        this.colorBValue=colorBValue;
        this.colorGValue=colorGValue;
        this.thickness=thickness;
    }
}

我一直在考虑存储线路所经过的点,然后在用户点击其中一个点上的Jpanel时做出相应的反应。然而,这似乎不是最好的解决方案。还有更好的吗?

1 个答案:

答案 0 :(得分:1)

创建一个收集行,并使用PointMouseEvent提供的MouseListener迭代收集并检查每个Line上是否有该点。您可能必须推广自己的Line类并实施contains方法(请注意,Line2D无法使用,因为包含方法始终返回 false )。

确定Point P 是否在线上:

距离 P A )+ 距离 P ,< strong> B )= 距离 A B

A B 是行端点, P 是测试点。可以使用误差项来允许在线附近但不完全在线上的点(例如,当使用更宽的笔划进行渲染时,您可能希望增加此误差项)。假设您的班级有端点 a b

public boolean contains(Point p, double error){
    double dist = Math.sqrt(Math.pow(p.x - a.x, 2) + Math.pow(p.y - a.y, 2)) + 
            Math.sqrt(Math.pow(p.x - b.x, 2) + Math.pow(p.y - b.y, 2));
    return Math.abs(dist - this.distance) <= error;
}