Java 如何防止鼠标侦听器临时出现在窗口上?

Java 如何防止鼠标侦听器临时出现在窗口上?,java,swing,mouselistener,Java,Swing,Mouselistener,我正在用Java编写一个游戏,这是我第一次尝试制作“漂亮”的游戏。这个游戏叫做Bantumi——这是一个棋盘游戏,现在我正在为这些动作编写动画。问题是,当运动动画运行时,电路板仍会获得鼠标事件,如果用户选择新的运动,则运行的运动将被丢弃 对于板,我使用了一个类扩展JLayeredPane。这就是我如何拥有我的图层: 第0层:带有种子的孔,因此用户选择一个用于移动,每个孔都是一个带有鼠标听写器的JPanel 图层1:标记当前选定孔的高光 第2层:运动的动画 第10层:我编写的一个定制通知系统类,它

我正在用Java编写一个游戏,这是我第一次尝试制作“漂亮”的游戏。这个游戏叫做Bantumi——这是一个棋盘游戏,现在我正在为这些动作编写动画。问题是,当运动动画运行时,电路板仍会获得鼠标事件,如果用户选择新的运动,则运行的运动将被丢弃

对于板,我使用了一个类扩展JLayeredPane。这就是我如何拥有我的图层:

第0层:带有种子的孔,因此用户选择一个用于移动,每个孔都是一个带有鼠标听写器的JPanel

图层1:标记当前选定孔的高光

第2层:运动的动画

第10层:我编写的一个定制通知系统类,它表示“你的回合”、“重复回合”、“你赢了”等内容

我想在动画运行时防止任何层中的每一个可能的鼠标事件,我该怎么做?我认为在一个顶级球员身上增加一个覆盖整个区域的面板就足够了,但这并不奏效。有解决办法吗

我认为在一个顶级球员身上增加一个覆盖整个区域的面板就足够了,但这并不奏效

如果这是一个Swing GUI,那么您已经有了一个JPanel来覆盖顶级窗口glassPane,但是实现这一功能的唯一方法是您必须添加一个MouseStener(或者同时添加MouseStener和MouseMotionListener),并且必须使其可见

您可以通过在顶级窗口或其根窗格上调用
getGlassPane()
来获取顶级窗口的glasspane,向其添加MouseListener和MouseMotionListener,然后每当您想使GUI对鼠标事件无响应时,通过在其上调用
setvisable(true)
将玻璃窗格设置为可见。通过调用
setvisable(false)

以(暂时)禁用您可以使用的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();
         }
     } 
     .
     .
     .
}

这正是我需要的。我尝试了类似的方法,唯一的区别是我没有将鼠标侦听器添加到顶部窗格,我认为这是必要的。谢谢。@DanielRivas:是的,这是必要的,因为组件必须是可见的,并且必须捕获鼠标事件才能工作。否则鼠标事件将滑过。由于GlassPane可以阻止来自MouseXxx的事件,KeyListener可以工作并继续从键盘侦听事件,没有比@Camickr更好的方法了,请在有机会时给出答案。这在需要禁用组件上的准时事件时非常有用,这次我试图禁用所有可见组件,因此玻璃窗格方法在这里很有用。无论如何,我不知道这个方法(consume()),所以我学到了一些新的东西。谢谢是的,mKorbel是Swing知识的载体。我也从中吸取了教训。1+