Как я узнаю, что я в ветке рассылки событий? - PullRequest
14 голосов
/ 23 октября 2011

1.Посмотрите, что мой код находится на какой-то строке JPanel, которая у меня есть, я автоматически на EDT?

2. Тот же вопрос для всех других классов, которые не относятся к GUI, JPanels или другим классам представления, простой логический класс.

3.Если у меня есть JPanel, в которой я играю музыку, находясь в ней, должна ли музыка запускаться в потоке диспетчеризации событий или в другом потоке, который не является EDT (для того, чтобы не блокировать графический интерфейс, хотя я не чувствовал никакого проблема с запуском его из EDT)?

Примечание: я хочу общее правило, как узнать это без использования SwingUtilities.isEventDispatchThread()
Спасибо

Ответы [ 2 ]

23 голосов
/ 23 октября 2011
  1. Нет.
  2. Нет.
  3. Фоновая нить.

Если код, работающий вне EDT, вызывает метод, определенный в классе GUI, токод будет выполняться не в EDT, а в вызывающем потоке.

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

Правило состоит в том, что если вы не создаете другой поток, вызываемый вами метод будет выполняться в потоке, из которого выполняется вызывающий код - потоки не соответствуют тому, в каких классах определены методы.

Методы, которые будут работать в EDT, это прослушиватели событий , когда они вызываются Swing, а не вами.(Они все еще могут быть, если вы вызываете их из EDT.)

Кроме того, любой код внутри Runnable.run() метода передается в SwingUtilities.invokeLater() и invokeAndWait() также выполняется в EDT.

Любые обычные методы, которые вы вызываете из EDT, будут выполняться в EDT.

Любой код, вызываемый из Thread, который вы создаете (будь то с помощьюнапрямую, или ExecutorService, или SwingWorker.doInBackground()) - это , а не в EDT.В вашей программе main() метод также не на EDT.

9 голосов
/ 23 октября 2011

Согласно моему комментарию: когда все остальное терпит неудачу, класс SwingUtilities имеет статический метод, который вы можете использовать: SwingUtilities.isEventDispatchThread()

Что касается числа 3), определенно используйте фоннить.

И, насколько я знаю, не существует "общего правила".Да, код в вашем графическом интерфейсе должен быть на EDT, но если у вас есть ошибка, это может и не произойти, хотя обычно это так.То же самое для слушателей Swing.

...