【问题标题】:Java JPanel mouse listener doesn't work over its componentsJava JPanel 鼠标侦听器不适用于其组件
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 那是正常的约定@Snicolas 吗?
  • 一点也不,但你正在寻找的也不是正常的约定。 :)
  • 但请相信共享听众是一种常见的做法。也许更多的分享行动。无论如何,比去重的代码要好得多。
【解决方案2】:

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

【讨论】:

  • 如果我没有最终让我的事件通过玻璃窗格工作,这本来就是我会做的,所以我接受这个作为这个问题的答案。谢谢。
  • 这就是我现在所做的 - 在发现我无法让我的 Java 应用程序允许 MouseListener 事件处理超过 1 层的漫长/困难方法之后。再次感谢@ChuckFricano。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多