Java - 如何DO_NOTHING_ON_CLOSE,然后启用EXIT_ON_CLOSE?

时间:2011-12-14 04:21:27

标签: java swing window listener

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

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

所以,我的问题是,如何在 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);
}

2 个答案:

答案 0 :(得分:3)

为什么不在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;
}

答案 1 :(得分:0)

结果我只需要添加另一个窗口监听器来捕获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时会被覆盖。