2

モーダルダイアログボックスを起動するSwingWorkerスレッドがあり(startedのStateValueをリッスンするプロパティ変更リスナーから)、SwingWorkerはその作業を続行します。ただし、doneメソッドはEDTで呼び出されているため呼び出されていないようですが、SwingWorkerのモーダルダイアログがEDTをブロックしています。そのため、EDT(またはdoneメソッド)からダイアログを閉じることができません。現在、そのメソッドの最後でdoInBackgroundからダイアログを閉じていますが、EDT上にないため、doInBackgroundからは少し安全ではないようです。これを処理するための最良の方法は何ですか?ありがとう。

4

2 に答える 2

4

SwingWorkerディスパッチループは、モーダルダイアログが表示されている場合でも、関連付けられているイベントをディスパッチし続ける必要があります。

これは私のために働きます。

import javax.swing.*;

public class Unions {
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
            runEDT();
        }});
    }
    private static void runEDT() {
        final JDialog dialog = new JDialog((JFrame)null, true);
        new SwingWorker<Void,Void>() {
            @Override protected Void doInBackground() throws Exception {
                // But this is working.
                Thread.sleep(3000);
                return null;
            }
            @Override protected void done() {
                dialog.setVisible(false);
            }
        }.execute();
        dialog.setVisible(true);
    }
}
于 2009-12-18T01:24:19.903 に答える