2012-03-20 140 views
2

此问题的解决方案是什么?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 } 

共ORDS从不打印出来,直到我得到正确的JPanel的容器的边缘,这是因为按钮阻塞了其余部分。

如何让鼠标侦听器可以在所有面板组件上工作,而无需将侦听器添加到每个组件?或者我应该将侦听器添加到每个组件?

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

我会尝试将其添加到的glassPane,而不是...(目前中的getRootPane()给我的NullPointerException)

编辑: 我现在知道,我想中的getRootPane( )从JPanel这不是根容器,这就是为什么我得到一个null。我需要在主JFrame上执行此操作。

EDIT2: 好了,所以我已经做了(加玻璃板主JFrame的),首先我有一个问题,因为我没有做到这一点:

myGlassPane.setVisible(true);

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

myGlassPane.setOpaque(false);

所以,现在我得到的X,Y共同ORDS打印出来,在按钮和一切,但是按钮不起作用,因为它们上面有一个面板。

+0

您可能不得不使用glasspane截取鼠标,然后让它将鼠标事件分派给下面的所有基础组件。 – 2012-03-20 20:57:03

+0

不要为按钮使用'MouseListener'!一个'ActionListener'将响应鼠标和键盘的输入。 – 2012-03-20 21:05:25

+0

嗨皮特:D。当我尝试'myPanel.getRootPane()时,我无法绕过'NullPointerException' ...'当我试图去玻璃板。 – Ozzy 2012-03-20 21:10:51

回答

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

如果我没有终于通过玻璃窗看到我的活动,我会这样做,所以我接受这个问题作为这个问题的答案。谢谢。 – Ozzy 2012-03-22 01:26:28

+0

这就是我现在所做的 - 在找出长时间/困难的方式后,我无法让我的Java应用程序允许MouseListener事件与超过1层一起工作。再次感谢@ChuckFricano。 – Ozzy 2012-03-22 15:20:30

2

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

+0

那么正常的会议@Snicolas? – Ozzy 2012-03-20 21:23:07

+1

完全不是,但是你在寻找的东西既不是正常的约定。 :) – Snicolas 2012-03-21 05:48:02

+0

但请确保分享听众可以是一种常见的做法。也许更多的分享行动。无论如何,比删除重复代码好得多。 – Snicolas 2012-03-21 14:38:43