如何在窗口上临时防止鼠标监听器?

时间:2012-02-20 22:20:52

标签: java swing mouselistener

我正在用Java编写一个游戏,这是我第一个尝试“漂亮”的游戏。这款游戏被称为Bantumi - 它是一款棋盘游戏,现在我正在为动作编写动画。问题在于,当运动动画运行时,主板仍然会获得鼠标事件,如果用户选择了新的运动,则运行的运动将被丢弃。

对于董事会,我正在使用扩展JLayeredPane的类。这就是我的图层:

第0层:带有种子的洞,因此用户选择一个用于移动,每个洞是带有MouseListener的JPanel。

第1层:标记当前所选孔的突出显示

第2层:运动的动画。

第10层:我写的一个自定义通知系统类,它说的是“你的转弯”,“重复转弯”,“你赢了”等等。

我希望在动画运行时阻止任何这些图层中的每个可能的鼠标事件,我该怎么做?我认为在顶级播放器中添加一个覆盖整个区域的面板就足够了,但它没有用。任何解决方法?

2 个答案:

答案 0 :(得分:5)

对于(临时)禁用来自MouseListener(KeyListener ....)的事件,您可以使用

public void consume()
Consumes this event so that it will not be processed in the 
default manner by the source which originated it.

例如

whatever.addMouseListener(new MouseListener() {

    public void mouseClicked(MouseEvent e) {
         if (somethingIsTrue) {
            //do some stuff from mouse listener         
         } else {
            e.consume();
         }
     } 
     .
     .
     .
}

答案 1 :(得分:4)

  

我认为在顶级播放器中添加一个覆盖整个区域的面板就足够了,但它没有用。

如果这是一个Swing GUI,你已经有了一个覆盖顶层窗口的JPanel,即glassPane,但是要做到这一点的唯一方法就是你必须添加一个MouseListener(或者同时添加MouseListener和MouseMotionListener),你必须让它可见。

您可以通过在顶级窗口或其根窗格上调用getGlassPane(),向其添加MouseListener和MouseMotionListener来获取顶部窗口的glasspane,然后每当您想要使GUI无法响应鼠标事件时,通过调用它上面的setVisble(true)将玻璃窗格设置为可见。您可以通过调用setVisble(false)来反复切换此效果。