2

いくつかのディレクトリをクリーンアップしたり、ファイルをコピーしたりする機能をアプリケーションに実装したいのですresetが、プロセスを完了するために再起動する必要があります。

アプリケーションを再実行する方法は? 実際の再起動ではありませんが、2 番目のインスタンスを開き、これを閉じるだけで十分だと思います。

私のアプリケーションのコアはクラス拡張JFrameですが、プログラムの実行時にクラスの拡張を読み取る静的ブロックがたくさんあります。すべての静的コレクションとブロックが再度作成/実行されるように、アプリケーションをプログラムで再起動する必要があります。

それはそのように始まります。

SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Window().createGUI();
        }
    });

これはうまくいくようです:

public void restart() {
    /*  dispose();
    Window.main(null);*/
    StringBuilder cmd = new StringBuilder();
    cmd.append(System.getProperty("java.home") + File.separator + "bin" + File.separator + "java ");
    for (String jvmArg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
        cmd.append(jvmArg + " ");
    }
    cmd.append("-cp ").append(ManagementFactory.getRuntimeMXBean().getClassPath()).append(" ");
    cmd.append(Window.class.getName()).append(" ");

    try {
        Runtime.getRuntime().exec(cmd.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.exit(0);
}
4

2 に答える 2

4

これは他のトピックからのものですが、この他のトピックで受け入れられている質問とは反対に、これは実際に機能します。

public void restart() {
          StringBuilder cmd = new StringBuilder();
            cmd.append(System.getProperty("java.home") + File.separator + "bin" + File.separator + "java ");
            for (String jvmArg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
                cmd.append(jvmArg + " ");
            }
            cmd.append("-cp ").append(ManagementFactory.getRuntimeMXBean().getClassPath()).append(" ");
            cmd.append(Window.class.getName()).append(" ");

            try {
                Runtime.getRuntime().exec(cmd.toString());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.exit(0);
    }

27/02/2018:マークがより良いソリューションを投稿したと思います: https://stackoverflow.com/a/48992863/1123020

于 2013-11-23T23:52:48.033 に答える
2

あなたの質問 / 私のコメント:

アプリケーションにリセット機能を実装して、いくつかのディレクトリをクリーンアップしたり、ファイルをコピーしたりしたいと考えています。プロセスを完了するには、アプリケーションを再起動する必要があります。アプリケーションを再実行する方法は?

これは、多くのアプリケーションの共通の機能/ニーズであり、学術的な課題だけではありません。残念ながら、これに対する万能の解決策はなく、すべてプログラムの仕様に依存します。プログラムが非常にモジュール化されており、スマートな MVC の懸念事項の分離を使用して作成されている場合、モデルを初期状態にリセットするか、新しいモデルを GUI にロードするだけで、これを行うのがはるかに簡単になります。

実際の再起動ではありませんが、2 番目のインスタンスを開き、これを閉じるだけで十分だと思います。

これは非常に悪い考えだと思います。テキスト コンポーネント、ボタン、チェックボックスなどの状態を元の状態に単純にリセットすることをお勧めします。繰り返しになりますが、コードをモジュール化すればするほど、実行が容易になります。個別のモジュールごとに、それを初期化する独自のreset()メソッドを持つことができます。

私の場合、多くの JPanel で構成される JFrame をリロードしたいと考えています。私はそれをしました:

繰り返しますが、この道を歩まないようにお願いします。

リセットを容易にするために、JTextComponents の一部を ArrayList に配置できます。たとえば、リセット内で GUI フィールドをリセットできます。何かのようなもの:

public void reset() {
  // assuming you have an ArrayList of JTextComponents called textComponents
  for (JTextComponent textComponent : textComponents) {
    textComponent.setText("");
  }

  // same if you had a bunch of comboboxes in a List called comboBoxes
  for (JComboBox comboBox : comboBoxes) {
    comboBox.setSelection(-1); // consider removing listeners first, then re-adding them

  //   etc for other components
  }
}

編集

私の解決策-> JFrameの破棄はあまり良くないことがわかりました。静的ブロックがたくさんあり、シリアル化されたファイルをロードしています。実際に再起動する必要があります。アプリケーション自体を実行する簡単な方法があるかもしれません。

申し訳ありませんが、これは、あなたのプログラムの組織が改善される可能性があることを示唆しているだけです。リセットできる必要があります。そうでない場合は、リセットできるように変更することを検討してください。Model-View-Control 構造に従っていますか? そうでない場合は、これを行うことを検討してください。

于 2013-11-23T23:33:59.283 に答える