gpt4 book ai didi

Java JPanel 鼠标监听器无法在其组件上工作

转载 作者:行者123 更新时间:2023-12-04 05:53:28 24 4
gpt4 key购买 nike

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

我向 JPanel 添加了一个鼠标监听器,但该面板充满了覆盖 JPanel 整个区域的按钮。

示例(伪)代码:

Create JPanel
Set to GridLayout
Add 25 buttons (5x5 grid)
Add MouseListener to JPanel

鼠标监听器/鼠标运动监听器:
onMouseMove { print out X,Y co-ords of mouse }

在我到达 JPanel 容器的边缘之前,永远不会打印出坐标,因为按钮挡住了它的其余部分。

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

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

我将尝试将它添加到 glassPane 中......(此时 getRootPane() 给了我 NullPointerException)

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

编辑2:
好的,我已经完成了(向主 JFrame 添加了玻璃 Pane ),起初我遇到了问题,因为我没有这样做:
myGlassPane.setVisible(true);
所以它似乎不起作用。但是一旦我这样做了,我所要做的就是将不透明标志设置为 false 以使其透明
myGlassPane.setOpaque(false);
所以现在我在按钮和所有东西上打印了 X、Y 坐标,但是按钮不起作用,因为它们上面有一个面板。

最佳答案

用自定义按钮替换 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 JPanel 鼠标监听器无法在其组件上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9794765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com