Java JPanel鼠标监听器并不适用于其组件

时间:2012-03-20 20:54:45

标签: java swing mouselistener

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

我在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容器的边缘之前,合作伙伴永远不会打印出来,因为按钮会阻挡其余部分。

如何让鼠标监听器在所有面板的组件上工作,而不必将监听器添加到每个组件 - 或者我是否应该将监听器添加到每个组件?

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

我打算尝试将它添加到glassPane中......(目前getRootPane()给我NullPointerException)

修改 我现在知道我正在尝试从不是根容器的JPanel获取getRootPane(),这就是我得到null的原因。我需要在主JFrame上执行此操作。

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

myGlassPane.setVisible(true);

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

myGlassPane.setOpaque(false);

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

用自定义按钮替换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);
    }    
}