我有一个游戏,我试图拦截一个关闭事件并将用户返回到主菜单。我使用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);
}
答案 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
时会被覆盖。