Модальный диалог Swing Worker не закрывается - PullRequest
2 голосов
/ 18 декабря 2009

У меня есть поток SwingWorker, который запускает модальное диалоговое окно (из прослушивателя изменения свойства, который прослушивает StateValue запущенного), и работник Swing продолжает выполнять свою работу. Однако, похоже, что готовый метод не вызывается, потому что он вызывается в EDT, но модальное диалоговое окно рабочего качания блокирует EDT. Таким образом, я не могу закрыть диалог из EDT (или из готового метода). Прямо сейчас я просто закрываю диалог из doInBackground в конце этого метода, но это кажется немного небезопасным из doInBackground, так как его нет в EDT. Какой лучший способ справиться с этим? спасибо.

Ответы [ 2 ]

4 голосов
/ 18 декабря 2009

Цикл диспетчеризации должен продолжать отправлять события, связанные с 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);
    }
}
2 голосов
/ 03 марта 2011

Для справки:

Когда модальный диалог запускается в Swing, выполнение этого потока останавливается до тех пор, пока диалог не будет закрыт.

Вот почему ваш метод done () никогда не вызывался (doInBackground () не может завершиться, а done () вызывается только после этого).

Открытие модального диалога из действия, вызываемого потоком EDT, немного отличается. Сам EDT будет продолжать обрабатывать события, но фактический код потока событий (код действия), который открывает модальное диалоговое окно, все еще блокируется (и ждет, пока диалоговое окно не будет закрыто).

Естественно, в случае немодальных диалогов эта проблема никогда не появляется.

Кстати: вы никогда не должны открывать диалог вне EDT. Если решение принято для потока, не являющегося EDT, вам нужно использовать SwingUtilities.invokeLater (), чтобы фактически открыть диалоговое окно.

Звучит сложно, но на самом деле это не так, как только вы овладеете концепцией EDT.

...