4

私は、ユーザーがSwingGUIにデータを入力する必要があるアプリを作成しています。このデータはアプリが使用します。ユーザーがデータを入力すると、アプリがデータをファイルに書き込むため、GUIは不要になります。

一般的な考え方は次のとおりです。

launchGui();
closeGui();
continueWithComputation();

Swingがバックグラウンドでいくつかのスレッドを使用していることを理解しています。これが、GUIが閉じられるまでプログラムがブロックされない理由です。

続行する前に、GUIが閉じる(シングルJFrameクローズ)のを待つことはできますか?dispose()continueWithComputation()

4

4 に答える 4

6

続行する前に Swing GUI が閉じるのを待ちます

モーダル ダイアログを使用します。詳細については、次を参照してください。

于 2012-06-04T05:22:01.553 に答える
2

continueWithComputation() を続行する前に、GUI が閉じる (単一の JFrame が dispose() で閉じられる) のを待つことは可能ですか?

  • ユーザー アクションはWindowListenerを追加します

  • コードから呼び出しJFrame#setVisible(false)まで、実行できますcontinueWithComputation()。このJVMを閉じる​​必要がありますSystem.exit(0)。そうしないと、再起動するか電源がオフになるまでPCのRAMに残ります

于 2012-06-04T05:39:47.577 に答える
0

私の提案は、JFrame GUI をモーダルとして開き、画面から消えるまですべてを待機することです。JFrame はモーダルとして設定できないため、GUI フレームを JDialog として開く必要があります。私は使っている:

public class frameMain extends JDialog{ 

使用するコンストラクターに次のことを確認してください。

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

GUI フレームを開始する必要がある場合はいつでも、以下を使用する必要があります。

frameMain frm= new frameMain ();
frm.setModal(true);
frm.setVisible(true);
于 2021-01-29T12:08:23.160 に答える
0

同様の問題がありましたが、メソッドがなく、closeGui()WindowListener といくつかの Java 同期を使用して、この比較的短いコード スニペットを思いつきました。

AtomicBoolean closed = new AtomicBoolean(false);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosed(WindowEvent e) {
        synchronized(closed) {
            closed.set(true);
            closed.notify();
        }
        super.windowClosed(e);
    }
} );

frame.setVisible(true);
synchronized(closed) {
    while (!closed.get()) {
        closed.wait();
    }
}

// executes after the Frame has been disposed
于 2019-04-12T12:05:19.833 に答える