web-dev-qa-db-ja.com

終了する前にアプリケーションオプションを保存する方法は?

アプリケーションを作成しましたが、終了する前にいくつかのオプションを保存する必要があります(ウィンドウのサイズなど、ファイルに書き込まれます)。

メインフレームはこれを設定しました:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

興味のあるオプションを保存するにはどうすればよいですか?(もちろん終了する前に)

ありがとう!

20
artaxerxe

アプリケーションのシャットダウン時に何かを実行したい場合は、次のコードを使用してシャットダウンをフックできます。

    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プロセスは残酷に殺されます)。

34
Romain Linsolas

以下が役立つかもしれません。

  1. まず、プロパティファイルを読み取る必要があります。 ドキュメントを参照

    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) {
        }
      }
    });
    

あなたが正しいことを私が理解していれば、それだけです)

6
ponkin

WindowListener を登録し、windowCloseメソッドにオプションを保存することができます。

そしてもちろん

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
2
PeterMmm

これがあなたの状況に当てはまるかどうかはわかりませんが、このスレッドにアクセスする他の人にも当てはまる可能性があります。私のアプリケーションにはmain()があり、最後にwhile(!Shell.isDisposed)ループがあります。アプリケーションが実行されるとそのループが進行し、アプリが閉じられるとそのループは終了し、mainメソッドのその後のループにドロップします。ここで、エディターがダーティであるかどうか、および設定が変更されているかどうかをチェックし、それらを条件に合わせて処理します。ファイルcloseに添付された私のメソッドは、シェルを破棄してcloseCurrent()メソッドを呼び出しますが、誰かが「x」ウィンドウを閉じるアイコンをクリックすると、ここに表示され、何かが汚れていないかどうかをもう一度確認し、必要に応じて保存します。

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