Java JPanel鼠标侦听器不';不要在它的部件上工作

Java JPanel鼠标侦听器不';不要在它的部件上工作,java,swing,mouselistener,Java,Swing,Mouselistener,这个问题的解决办法是什么 我在JPanel中添加了一个鼠标侦听器,但是该面板上充满了覆盖整个JPanel区域的按钮 示例(伪)代码: MouseListener/MouseMotionListener: onMouseMove { print out X,Y co-ords of mouse } 在我到达JPanel容器的边缘之前,这些单词永远不会被打印出来,因为按钮挡住了它的其余部分 如何使鼠标侦听器能够在面板的所有组件上工作,而不必将侦听器添加到每个组件中?还是应该将侦听器添加到每个组件中

这个问题的解决办法是什么

我在JPanel中添加了一个鼠标侦听器,但是该面板上充满了覆盖整个JPanel区域的按钮

示例(伪)代码:

MouseListener/MouseMotionListener:

onMouseMove { print out X,Y co-ords of mouse }
在我到达JPanel容器的边缘之前,这些单词永远不会被打印出来,因为按钮挡住了它的其余部分

如何使鼠标侦听器能够在面板的所有组件上工作,而不必将侦听器添加到每个组件中?还是应该将侦听器添加到每个组件中

新增信息: 我正在尝试为触摸屏系统添加一个触摸手势(滑动面板会导致动作发生)。 我对自己识别这个手势很有信心,但我真的在寻找一种“更好”的方法,而不是在每个组件中添加侦听器的副本(这对我来说更糟,因为组件正在变化)

我将尝试将其添加到玻璃窗格中。。。(此时getRootPane()给我NullPointerException)

编辑: 我现在知道我正试图从一个不是根容器的JPanel获取rootpane(),这就是为什么我会得到一个
null
。我需要在主框架上执行此操作

EDIT2: 好的,我已经这样做了(将玻璃窗格添加到主框架),起初我遇到了一个问题,因为我没有这样做:

myGlassPane.setVisible(true)

所以它似乎不起作用。但一旦我这么做了,我所要做的就是将不透明标志设置为false,使其透明

myGlassPane.setOpaque(false)


现在我在按钮和所有东西上打印出X,Y坐标,但是按钮不工作,因为上面有一个面板。

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

用自定义按钮替换JButton。将所需事件从按钮转发到按钮的父级。下面的示例将转发鼠标输入的事件。根据需要调整转发并添加异常/错误处理

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

您可能必须使用glasspane拦截鼠标,然后让它将鼠标事件分派给下面的所有底层组件。不要对按钮使用
MouseListener
ActionListener
将对鼠标和键盘输入做出响应。嗨,皮特:D。当我试图进入玻璃窗格时,我无法绕过
NullPointerException
。getRootPane()…
。嗨,安德鲁,这不是为了按钮,而是为了窗口(此时正在按住按钮)。我实际上在尝试添加一个触摸手势(当向后滑动时,上一个面板将再次显示)成功!有人通知我这件事。(掌声…)那么,Snicolas的正常习俗是吗?一点也不,但你所寻找的也不是正常的习俗但要相信,分享听众可能是一种常见的做法。也许会有更多的分享活动。无论如何,这比重复数据消除代码要好得多。如果我没有最终让我的事件通过玻璃窗工作,我会这么做,所以我接受这一点作为这个问题的答案。谢谢。这就是我现在所做的——在我发现我没有办法让我的Java应用程序允许MouseStener事件处理多个层之后。再次感谢ChuckFricano。
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);
    }    
}