正如标题所说,我希望能够右键单击我在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时做出相应的反应。然而,这似乎不是最好的解决方案。还有更好的吗?
答案 0 :(得分:1)
创建一个收集行,并使用Point
中MouseEvent
提供的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;
}