Подтвердить что ты не робот

Как узнать, есть ли я в потоке отправки событий?

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

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

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

Примечание. Мне нужно общее правило, как узнать его, не используя SwingUtilities.isEventDispatchThread()
Благодаря

4b9b3361

Ответ 1

  • Нет.
  • Нет.
  • Фоновая тема.

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

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

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

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

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

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

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

Ответ 2

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

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

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