【发布时间】:2011-01-22 14:55:09
【问题描述】:
我已经做了一个应用程序,我需要在退出之前保存一些选项。(像窗口尺寸,...,将写入一个文件。)
主框架已经设置了这个:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
如何保存我感兴趣的选项?(当然是在退出之前)
谢谢!
【问题讨论】:
标签: java swing desktop-application processing
我已经做了一个应用程序,我需要在退出之前保存一些选项。(像窗口尺寸,...,将写入一个文件。)
主框架已经设置了这个:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
如何保存我感兴趣的选项?(当然是在退出之前)
谢谢!
【问题讨论】:
标签: java swing desktop-application processing
如果您只想在应用程序关闭时做某事,您可以使用以下代码挂钩关闭:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
// Do what you want when the application is stopping
}
}));
但是,这不允许您不关闭窗口。如果您需要在真正退出之前检查某些内容,您可以覆盖windowClosing 事件:
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
// Do what you want when the window is closing.
}
});
请注意,第一个解决方案 - 使用关闭挂钩 - 的优点是它与窗口事件无关,并且即使应用程序被另一个事件停止也会执行(当然,如果 Java 进程除外被残忍杀害)。
【讨论】:
以下可能会有所帮助。
首先你需要阅读你的属性文件。 See doc
Properties properties = new Properties();
try {
properties.load(new FileInputStream("filename.properties"));
} catch (IOException e) {
System.err.println("Ooops!");
}
第二次将事件处理程序添加到您的窗口,这会将您的数据保存在属性文件中。您需要保存的所有内容只需放入属性实例并在退出时存储它
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
try {
properties.store(new FileOutputStream("filename.properties"), null);
} catch (IOException e) {
}
}
});
仅此而已,如果我理解你的话)
【讨论】:
e.printStackTrace()。示例代码很容易变成生产代码,我们都必须在以后维护它。
您可以注册WindowListener 并将您的选项保存在 windowClose 方法中。
当然
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
【讨论】:
不确定这是否适用于您的情况,但可能适用于浏览此主题的其他人。 我的应用程序有一个 main(),最后有一个 while (!shell.isDisposed) 循环。 当应用程序运行时,该循环正在进行,当应用程序关闭时,该循环结束并下降到 main 方法中的任何内容。 这是我检查编辑器是否脏以及首选项是否已更改并根据条件处理的地方。 我附加到文件 close 的方法会处理 shell 并调用 closeCurrent() 方法,但如果有人单击“x”关闭窗口图标,它会落到此处,我会再次检查是否有任何脏东西,并在需要时保存。
while (!shlCpbtool.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
// exit
if(dirty){
closeCurrent();
}
【讨论】: