Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:具有重叠组件的鼠标命中检测_Java_Swing_Jpanel_Java 2d - Fatal编程技术网

Java:具有重叠组件的鼠标命中检测

Java:具有重叠组件的鼠标命中检测,java,swing,jpanel,java-2d,Java,Swing,Jpanel,Java 2d,我有一个布局为空的JPanel。在这个面板上,我画了一些自定义的JC组件,如标记、红色小圆和线 当线条不是水平或垂直时,JComponent的“敏感区域”是一个矩形,其斜边为线条本身。这个过多的区域通常会“窃取”鼠标事件到标记 如果用户没有单击实线,如何使鼠标事件“传递”到覆盖对象?正确的方法是moonwave99建议的方法 1) 创建并绘制一组线 2) 使用Graphics2D原语覆盖JPanel的paintComponent方法绘制数组中的每一行 3) 在JPanel中添加一个鼠标侦听器,在

我有一个布局为空的JPanel。在这个面板上,我画了一些自定义的JC组件,如标记、红色小圆和线

当线条不是水平或垂直时,JComponent的“敏感区域”是一个矩形,其斜边为线条本身。这个过多的区域通常会“窃取”鼠标事件到标记


如果用户没有单击实线,如何使鼠标事件“传递”到覆盖对象?

正确的方法是moonwave99建议的方法

1) 创建并绘制一组线

2) 使用Graphics2D原语覆盖JPanel的paintComponent方法绘制数组中的每一行


3) 在JPanel中添加一个鼠标侦听器,在行的数组中添加一个搜索功能,以了解选择了哪一行。

为什么要使用
JComponent
s而不是
Graphics2D
原语?最好在
JPanel
上使用一个
MouseListener
。我能想到的唯一方法是在所有父节点上手动调用
JComponent.processMouseEvent
。这很混乱,因为您需要在两个组件之间转换鼠标点。Moonwave99的建议更简单,更适合你的需要…直到你发现这个问题。更好。最后还将高亮显示线条的边界框,并且每次都必须将内容移动到渲染列表的顶部,但一旦将所有内容都放在同一个侦听器中,这很容易理解。作为@moonwave99方法的示例,请参见此和此