首页 文章

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

提问于
浏览
2

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

对于董事会,我正在使用扩展JLayeredPane的类 . 这是我如何拥有我的图层:

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

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

第2层:运动的动画 .

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

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

2 回答

  • 4

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

    如果这是一个Swing GUI,你已经有了一个覆盖顶级窗口的JPanel,即glassPane,但实现这个功能的唯一方法是你必须添加一个MouseListener(或者同时添加MouseListener和MouseMotionListener),你有让它可见

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

  • 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();
             }
         } 
         .
         .
         .
    }
    

相关问题