【发布时间】:2012-04-05 09:21:49
【问题描述】:
这个问题的解决方法是什么?
我在 JPanel 中添加了一个鼠标侦听器,但该面板充满了覆盖 JPanel 整个区域的按钮。
示例(伪)代码:
Create JPanel
Set to GridLayout
Add 25 buttons (5x5 grid)
Add MouseListener to JPanel
MouseListener/MouseMotionListener:
onMouseMove { print out X,Y co-ords of mouse }
在我到达 JPanel 容器的边缘之前,永远不会打印出坐标,因为按钮挡住了它的其余部分。
如何使鼠标侦听器在面板的所有组件上工作,而不必将侦听器添加到每个组件 - 或者我应该将侦听器添加到每个组件?
添加信息: 我正在尝试为触摸屏系统添加触摸手势(滑动面板会导致动作发生)。 我对自己识别手势非常有信心,但我真的在寻找一种“更好”的方法,而不是为每个组件添加侦听器的副本(这对我来说更糟,因为组件正在改变)。
我将尝试将其添加到 glassPane...(此时 getRootPane() 给我 NullPointerException)
编辑:
我现在知道我正试图从不是根容器的 JPanel 中获取 getRootPane(),这就是为什么我得到一个 null。我需要在主 JFrame 上执行此操作。
EDIT2: 好的,我已经完成了(在主 JFrame 中添加了玻璃窗格),起初我遇到了问题,因为我没有这样做:
myGlassPane.setVisible(true);
所以它似乎不起作用。但是一旦我这样做了,我所要做的就是将 opaque 标志设置为 false 以使其透明
myGlassPane.setOpaque(false);
所以现在我在按钮和所有内容上打印出 X、Y 坐标,但是按钮无法正常工作,因为它们上方有一个面板。
【问题讨论】:
-
您可能必须使用玻璃窗格拦截鼠标,然后让它将鼠标事件分派给下面的所有底层组件。
-
不要将
MouseListener用于按钮!ActionListener将响应鼠标和键盘输入。 -
嗨皮特:D。当我尝试到达 glassPane 时尝试
myPanel.getRootPane()...时,我无法绕过NullPointerException。 -
嗨,安德鲁,它不是按钮,它是窗口(目前正在按住按钮)。我实际上是在尝试添加触摸手势(当向后滑动时,前一个面板将再次显示)
-
成功!我被通知了那个。 (掌声..)
标签: java swing mouselistener