gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:33:18 26 4
gpt4 key购买 nike

正如标题所示,我希望能够右键单击在 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 时做出相应的 react 。然而,这似乎不是最好的解决方案。还有更好的吗?

最佳答案

创建一个 Collection Lines,并使用 MouseListener 中的 MouseEvent 提供的 Point,迭代 Collection 并检查该点是否位于每行上。您可能必须推出自己的 Line 类并实现 contains 方法(请注意,不能使用 Line2D,因为它的 contains 方法始终返回 false)。

要确定点P是否在线上:

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

其中AB是线端点,P是测试点。可以使用误差项来允许靠近但不完全在线上的点(例如,当使用较宽的笔划进行渲染时,您可能希望增加此误差项)。假设您的类有端点 ab:

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;
}

关于java - 如何将鼠标监听器添加到使用 Graphics.drawLine() 绘制的线条上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30244212/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com