我正在用Java编写一个游戏,这是我第一个尝试“漂亮”的游戏。这款游戏被称为Bantumi - 它是一款棋盘游戏,现在我正在为动作编写动画。问题在于,当运动动画运行时,主板仍然会获得鼠标事件,如果用户选择了新的运动,则运行的运动将被丢弃。
对于董事会,我正在使用扩展JLayeredPane的类。这就是我的图层:
第0层:带有种子的洞,因此用户选择一个用于移动,每个洞是带有MouseListener的JPanel。
第1层:标记当前所选孔的突出显示
第2层:运动的动画。
第10层:我写的一个自定义通知系统类,它说的是“你的转弯”,“重复转弯”,“你赢了”等等。
我希望在动画运行时阻止任何这些图层中的每个可能的鼠标事件,我该怎么做?我认为在顶级播放器中添加一个覆盖整个区域的面板就足够了,但它没有用。任何解决方法?
答案 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)
来反复切换此效果。