Как могут работать диалоги Swing? - PullRequest
18 голосов
/ 12 июня 2010

Если вы откроете диалог в 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 требует для запуска этого потока.

Так как это работает?

Ответы [ 2 ]

9 голосов
/ 12 июня 2010

Существующий поток диспетчеризации событий заблокирован, и поэтому 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

6 голосов
/ 12 июня 2010

Это нить AWT, а не Swing.

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

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

 Thread.dumpStack();

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

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

...