这个问题的解决方案是什么?
我在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合作打印出来的按钮和所有内容,但按钮不起作用,因为它们上面有一个面板。
答案 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);
}
}