【问题标题】:Java - how to DO_NOTHING_ON_CLOSE, then enable EXIT_ON_CLOSE?Java - 如何 DO_NOTHING_ON_CLOSE,然后启用 EXIT_ON_CLOSE?
【发布时间】:2011-12-14 04:21:27
【问题描述】:

我有一个游戏,我试图拦截关闭事件并将用户返回到主菜单。我已经使用DO_NOTHING_ON_CLOSE 解决了一半问题,但问题是我无法将常规功能返回到菜单屏幕。

您可能知道,问题在于,如果DO_NOTHING... 是操作,windowClosing 方法显然是最后一个触发的侦听器。

所以,我的问题是,我怎样才能将EXIT_ON_CLOSE 返回到窗口,之后 NOTHING 已经完成?在此期间,我想在没有任何用户输入的情况下做到这一点。我可以切换到另一个 JFrame 并从那里处理它,但必须有更好的方法来做到这一点。

代码示例:

WindowAdapter waReturnToMenu = new WindowAdapter() {
   @Override
   public void windowClosing(final WindowEvent e) {
        view.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        changeMenuState(0);
   }
};

然后,在改变菜单状态:

public void changeMenuState(int i0) {
    //...screen returns to menu, then

    view.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}

【问题讨论】:

    标签: java swing window listener


    【解决方案1】:

    为什么不在 WindowListener 中包含这个逻辑,因为它会在尝试关闭时被调用?您的代码设置布尔变量的状态,以告知 WindowListener 您是否希望它让用户返回程序或关闭程序。在 WindowListener 中,您将检查此布尔变量的状态,如果状态为某个值,则通过 System.exit(...) 退出程序。

    (变成答案)

    例如,

    // class field
    private boolean canClose = false;
    
    //....
    
    WindowAdapter waReturnToMenu = new WindowAdapter() {
       @Override
       public void windowClosing(final WindowEvent e) {
            if (canClose) {
               System.exit(0);
            } else {
               changeMenuState(0);
            }
       }
    };
    

    然后,在改变菜单状态:

    public void changeMenuState(int i0) {
        //...screen returns to menu, then
    
        canClose = true;
    }
    

    【讨论】:

    • 啊,我喜欢它,谢谢你的提示。我会研究一下代码然后回来。
    • 这个方法我其实没用过,但是比我的好:) 所以以后可能会实现。无论如何,已接受,抱歉让您久等了。
    【解决方案2】:

    原来我只需要添加另一个窗口侦听器来捕获 changeMenuState 中的默认关闭事件。

    所以不是

    public void changeMenuState(int i0) {
        //...screen returns to menu, then
    
        view.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    

    我现在有

    public void changeMenuState(int i0) {
        //...screen returns to menu, then
    
        view.addWindowListener(new WindowAdapter() {
               public void windowClosing(WindowEvent e) {
                   view.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
               }
        });
    }
    

    ...稍后在添加 waReturnToMenu 时将其覆盖。

    【讨论】:

    • 几个月后回到这个,我看到每次打开/关闭窗口时,都会添加一个新的事件监听器,这可能会导致性能问题(我认为)。所以,这个解决方案可能对了一半,也可能错了一半。但是,它也可以,所以我会留下它以防它对某人有帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多