【问题标题】:How to save application options before exit?如何在退出前保存应用程序选项?
【发布时间】:2011-01-22 14:55:09
【问题描述】:

我已经做了一个应用程序,我需要在退出之前保存一些选项。(像窗口尺寸,...,将写入一个文件。)

主框架已经设置了这个:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

如何保存我感兴趣的选项?(当然是在退出之前)

谢谢!

【问题讨论】:

    标签: java swing desktop-application processing


    【解决方案1】:

    如果您只想在应用程序关闭时做某事,您可以使用以下代码挂钩关闭:

        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 进程除外被残忍杀害)。

    【讨论】:

    • 当我使用构造函数 Thread() 时,保存在 Thread.run() 方法中的文件已损坏。但是,当我按照本示例中的建议使用构造函数 Thread(Runnable) 时,文件已正确保存。是我幸运还是构造函数类型重要?
    • 这在处理小程序中也非常有用。退出它们时,并不总是调用 void stop() 而此方法是。谢谢! :D
    • 除非您使用处理 IDE 并通过“停止”按钮退出草图,在这种情况下,即使这种方法似乎也不起作用。
    • 是的@rednoyz,如果您也关闭计算机,它将无法工作;o) 在这种情况下,您没有任何解决方案来捕获关闭事件...
    【解决方案2】:

    以下可能会有所帮助。

    1. 首先你需要阅读你的属性文件。 See doc

      Properties properties = new Properties();
      try {
        properties.load(new FileInputStream("filename.properties"));
      } catch (IOException e) {
        System.err.println("Ooops!");
      }
      
    2. 第二次将事件处理程序添加到您的窗口,这会将您的数据保存在属性文件中。您需要保存的所有内容只需放入属性实例并在退出时存储它

       addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
          try {
           properties.store(new FileOutputStream("filename.properties"), null);
          } catch (IOException e) {
          }
        }
      });
      

    仅此而已,如果我理解你的话)

    【讨论】:

    • 永远不要有空的catch-blocks,即使在示例代码中也是如此。在那里至少放一个e.printStackTrace()。示例代码很容易变成生产代码,我们都必须在以后维护它。
    • 其实这不是我的),只是快速复制/过去。但你是绝对正确的。
    【解决方案3】:

    您可以注册WindowListener 并将您的选项保存在 windowClose 方法中。

    当然

    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    

    【讨论】:

      【解决方案4】:

      不确定这是否适用于您的情况,但可能适用于浏览此主题的其他人。 我的应用程序有一个 main(),最后有一个 while (!shell.isDisposed) 循环。 当应用程序运行时,该循环正在进行,当应用程序关闭时,该循环结束并下降到 main 方法中的任何内容。 这是我检查编辑器是否脏以及首选项是否已更改并根据条件处理的地方。 我附加到文件 close 的方法会处理 shell 并调用 closeCurrent() 方法,但如果有人单击“x”关闭窗口图标,它会落到此处,我会再次检查是否有任何脏东西,并在需要时保存。

      while (!shlCpbtool.isDisposed()) {
              if (!display.readAndDispatch()) {
                  display.sleep();
              }
          }
          // exit
          if(dirty){
              closeCurrent();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-05
        • 2015-05-04
        • 2016-07-27
        • 2020-04-20
        • 1970-01-01
        • 2015-10-23
        • 2018-03-17
        • 2013-12-16
        相关资源
        最近更新 更多