Java JPanel鼠标侦听器无法在其组件上运行

这个问题的解决方案是什么?

我在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上执行此操作。

编辑2:好的,所以我已经完成了(添加玻璃窗格到主JFrame),起初我有一个问题,因为我没有这样做:

myGlassPane.setVisible(true);

所以它似乎无法正常工作。 但是,一旦我这样做,我所要做的就是将opaque标志设置为false以使其透明

myGlassPane.setOpaque(false);

所以现在我将X,Y合作打印出按钮和所有内容,但按钮不起作用,因为它们上面有一个面板。

用自定义按钮替换JButton。 将您需要的事件从按钮转发到按钮的父级。 这是一个转发鼠标输入事件的示例。 根据需要调整转发并添加exception/error handling。

 class JJButton extends JButton { { addMouseListener(new MouseAdapter(){ public void mouseEntered(MouseEvent e) { if (JJButton.this.getParent()!=null){ MouseListener[] ml = JJButton.this.getParent().getMouseListeners(); for (MouseListener l : ml) { l.mouseEntered(e); } } } }); } public JJButton(String string) { super(string); } } 

将您的监听器添加到面板和按钮。