Как диалоговые окна Swing могут даже работать?

При открытии диалогового окна в Swing, например, JFileChooser, он идет несколько как этот псевдокод:

swing event thread {
  create dialog
  add listener to dialog close event {
    returnValue = somethingFromDialog
  }
  show dialog
  (wait until it is closed)
  return returnValue
}

Мой вопрос: как это может возможно работать? Поскольку Вы видите, что поток ожидает для возврата, пока диалоговое окно не закрывается. Это означает, что поток события Swing заблокирован. Все же можно взаимодействовать с диалоговым окном, которое AFAIK требует, чтобы этот поток выполнил.

Таким образом, как это работает?

18
задан mKorbel 26 June 2012 в 08:02
поделиться

2 ответа

Это поток AWT, а не Swing.

Так или иначе, AWT запускает цикл диспетчеризации в шоу . События ввода в заблокированные окна блокируются. События перерисовки, события для разблокированных окон и общие события отправляются как обычно.

Вы можете увидеть это либо добавив строку:

 Thread.dumpStack();

в четную обработку модального диалогового окна, либо более просто из командной строки с помощью jstack или используя ctrl - \ ] / ctrl-break в командном окне приложения.

Библиотека Foxtrot злоупотребляет этим, чтобы предоставить более процедурную (в отличие от управляемой событиями) модель. Он также используется подключаемым модулем WebStart / Java для предоставления диалогов для служб JNLP и других при вызове из приложения EDT.

6
ответ дан 30 November 2019 в 09:18
поделиться

Существующий поток отправки событий заблокирован, и поэтому Swing создает другой поток, который перекачивает события. Тогда это поток отправки событий на время диалога.

Swing создает отдельный собственный поток для перекачки сообщений окна собственной ОС. Это отдельно от потока событий AWT.

В Windows вы видите эти потоки

  "AWT-Windows"   - the native UI thread
  "AWT-EventQueue-0" - the current AWT event dispatch thread

РЕДАКТИРОВАТЬ: Голосование против правильное. Это не так, по крайней мере, не во всех случаях.

Модальные диалоги часто сами заботятся о прокачке событий AWT. Если вы запустите код

SwingUtilities.invokeAndWait(new Runnable()
{
    public void run()
    {
        JOptionPane.showInputDialog("hello");
    }
});

, а затем прервете работу, глядя на потоки, вы увидите только один поток EventQueue. Метод show () JOptionPane сам перекачивает события.

Такие фреймворки, как Spin и Foxtrot, используют тот же подход - они позволяют вам создать длительный метод блокировки на EDT, но поддерживать поток событий, перекачивая сами события. У Swing может быть несколько потоков отправки (я уверен, что это было в случае со старыми версиями Swing), но теперь, когда многоядерность является обычным явлением, проблемы с параллелизмом, в частности, обеспечение правильной публикации изменений в одном потоке для других потоков, означают, что использование нескольких EDT приводит к ошибкам в текущей реализации. Видеть Несколько потоков отправки событий Swing

9
ответ дан 30 November 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: