【问题标题】:How to prevent Mouse Listener temporally on window?如何在窗口上暂时防止鼠标侦听器?
【发布时间】:2012-03-11 06:38:29
【问题描述】:

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

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

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

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

第 2 层:运动的动画。

第 10 层:我编写的自定义通知系统类,它会说“轮到你”、“重复轮到”、“你赢了”等内容。

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

【问题讨论】:

    标签: java swing mouselistener


    【解决方案1】:

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

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

    您可以通过在顶层窗口或其根窗格上调用 getGlassPane() 来获取顶层窗口的玻璃窗格,向其中添加 MouseListener 和 MouseMotionListener,然后每当您想让 GUI 对鼠标事件无响应时,设置通过调用setVisble(true) 可以看到玻璃窗格。您可以通过调用setVisble(false) 来关闭此效果。

    【讨论】:

    • 这正是我所需要的。我尝试了类似的东西,唯一的区别是我没有将鼠标监听器添加到顶部窗格中,我认为这是必要的。谢谢。
    • @DanielRivas:是的,这是必要的,因为组件必须可见并且必须捕获鼠标事件才能使其工作。否则鼠标事件将通过。
    • 因为 GlassPane 可以阻止来自 MouseXxx 的事件,所以 KeyListener 可以工作并继续从键盘监听事件,没有什么比 @camickr 的 Disabled Glass Pane 更好
    • 有机会请accept回答。
    【解决方案2】:

    对于(暂时)禁用来自 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();
             }
         } 
         .
         .
         .
    }
    

    【讨论】:

    • 这在您需要禁用组件上的准时事件时很有用,这次我试图禁用所有可见组件,因此玻璃窗格方法在这里很有用。反正我不知道这个方法(consume()),所以我学到了一些新东西。谢谢!
    • 是的,mKorbel 是 Swing 知识的字体。我也从中吸取了教训。 1+
    猜你喜欢
    • 2020-11-06
    • 2012-07-13
    • 1970-01-01
    • 2013-09-08
    • 2021-11-25
    • 2018-10-25
    • 1970-01-01
    • 2017-07-16
    • 2018-11-20
    相关资源
    最近更新 更多