2012-02-20 101 views
2

我正在用Java编写游戏,这是我试图让“漂亮”的第一个游戏。这款游戏被称为Bantumi--这是一款棋盘游戏,现在我正在编制动作动画。问题在于,当运动动画运行时,棋盘仍然会获得鼠标事件,如果用户选择了新动作,运行动画将被丢弃。如何在窗口上暂时阻止鼠标侦听器?

对于主板,我使用了扩展JLayeredPane的类。这我如何有我的图层:

第0层:与种子的孔,所以用户选择一个为运动,每个孔是与MouseListener的JPanel。

1层:这标志着当前选定的孔

层2中的突出显示:运动的动画。

层10:自定义通知系统类,我写的,它说的东西,如“现在轮到你了”,“重复转向”,“你赢了”,等等。

我想,以防止一切可能的鼠标事件动画运行时的任何这些图层,我该怎么做?我认为在顶级选手中添加一个覆盖整个区域的面板已经足够,但它不起作用。任何解决方法?

回答

4

我认为在顶级玩家中添加一个覆盖整个区域的面板已经足够,但它不起作用。

如果这是一个Swing GUI,你已经有了一个JPanel覆盖顶层窗口,的glassPane,而是使这项工作的唯一办法就是你必须添加的MouseListener(或两者的MouseListener和MouseMotionListener),并且必须使其可见。

您可以通过在顶级窗口或其根窗格上调用getGlassPane(),向其中添加MouseListener和MouseMotionListener,然后每当您想使GUI对鼠标事件无响应时,将玻璃设置到顶窗的玻璃窗格通过调用setVisble(true)就可以看到它。您可以通过调用setVisble(false)进行相反的操作来关闭此效果。

+0

这正是我需要的。我尝试了类似的东西,唯一的区别是我没有将鼠标监听器添加到顶部窗格,我认为这是必要的。谢谢。 – 2012-02-20 22:55:10

+0

@DanielRivas:是的,这是必要的,因为组件必须是可见的,并且必须捕获鼠标事件才能工作。否则,鼠标事件将滑过。 – 2012-02-20 23:07:30

+1

因为GlassPane可以阻止来自MouseXxx的事件,所以KeyListener可以工作并继续监听键盘事件,因为[Disabled Glass Pane](http://tips4java.wordpress.com/2008/11/07/disabled-glass-pane/ )@camickr – mKorbel 2012-02-20 23:25:53

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

当您需要禁用某个组件上的准时事件时,这非常有用,这次我试图禁用所有可见组件,所以这里的玻璃窗格方法很有用。无论如何,我不知道这个方法(消费()),所以我学到了一些新东西。谢谢! – 2012-02-20 22:58:52

+0

是的,mKorbel是Swing知识的一种字体。我也从中学到了。 1+ – 2012-02-20 23:08:10

+0

@Hovercraft全部鳗鱼感谢所有人,但不是真的+1 – mKorbel 2012-02-20 23:27:56

相关问题