gpt4 book ai didi

java - Swing WindowListener 如何否决 JFrame 关闭

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:35:09 25 4
gpt4 key购买 nike

我有一个框架,想在用户关闭它时提示用户保存文档。但如果他们取消,则框架不应关闭。

frame.addWindowListener(new SaveOnCloseWindowListener(fileState));
...
public class SaveOnCloseWindowListener extends WindowAdapter {
private final FileState fileState;

public SaveOnCloseWindowListener(FileState fileState) {
this.fileState = fileState;
}

public void windowClosing(WindowEvent e) {
if (!fileState.onQuit())
cancelClose();
}
}

FileState 查看文档是否脏。如果不是,则什么都不做并返回 true。如果它是脏的,它会询问用户是否要保存(是/否/取消)。如果此时用户取消,它应该中止窗口关闭。

我在网上看到的所有建议都涉及在 windowClosing 方法中显式退出,从而覆盖 JFrame.setDefaultCloseOperation() 的使用,并复制 JFrame.processWindowEvent() 中的代码。

我实际上有一个肮脏的解决方案,但想看看是否有更干净的解决方案。

干杯

最佳答案

正确的方法是在创建窗口时将 JFrame.setDefaultCloseOperation 设置为 DO_NOTHING_ON_CLOSE。然后在您的用户接受关闭时调用 setVisible(false)dispose(),或者在不接受关闭时什么也不做。

JFrame.setDefaultCloseOperation 的全部目的只是为了避免为最简单的操作实现WindowListeners。这些默认关闭操作执行的操作非常简单。

编辑:

我已经添加了我正在描述的解决方案。这假定您希望框架被完全删除。

frame.setDefaultCloseOperation(setDefaultCloseOperation);
frame.addWindowListener(new SaveOnCloseWindowListener(fileState));
...

public class SaveOnCloseWindowListener extends WindowAdapter {
private final FileState fileState;

public SaveOnCloseWindowListener(FileState fileState) {
this.fileState = fileState;
}

public void windowClosing(WindowEvent e) {
if (fileState.onQuit())
frame.dispose();
}
}

关于java - Swing WindowListener 如何否决 JFrame 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3777146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com