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

Должны ли мы использовать EventQueue.invokeLater для любого обновления графического интерфейса пользователя в настольном приложении Java?

Я знаю, что с помощью этого метода параметр runnable отправляется в систему EventQueue. Но должны ли все обновления графического интерфейса делать это с помощью этого метода? Я хочу сказать, если я хочу сказать, измените текст JButton, я должен использовать что-то вроде этого:

java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
         jButton1.setText("changed text");
      }
});

Если я должен использовать этот подход, любой шаблон, который мы можем использовать, чтобы избежать этого повторяющегося кода?

4b9b3361

Ответ 1

Вам нужно всего лишь использовать invokeLater, когда вы хотите обновить свой пользовательский интерфейс из другого потока, который не является потоком пользовательского интерфейса (поток отправки событий).

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

Предположим, однако, что при другом нажатии кнопки вы запускаете другой поток, который выполняет некоторую работу, и после завершения этой работы вы хотите обновить интерфейс. Затем вы используете invokeLater. Этот метод гарантирует, что ваше обновление пользовательского интерфейса выполняется в потоке пользовательского интерфейса.

Поэтому во многих случаях вам не нужно invokeLater, вы можете просто делать обновления интерфейса пользователя напрямую. Если вы не уверены, вы можете использовать isDispatchThread, чтобы проверить, запущен ли ваш текущий код в потоке отправки событий.

Ответ 2

Вам нужно сделать это, только если вы еще не находитесь в потоке отправки событий. Если вы не запустили новые потоки или не выполнили код из основного потока, весь ваш код, вероятно, уже запущен из потока отправки событий, что делает ненужным. Например, все обработчики событий пользовательского интерфейса вызываются в потоке отправки событий, поэтому вам не нужно будет делать это для вызываемого кода.

Ответ 3

Вместо того, чтобы действительно избегать "повторяющихся" (java-люди, вероятно, скажут, читаемый код без многих секретов), вы можете использовать функцию шаблонов Eclipse. я установил, чтобы он расширил две буквы "il" до следующего блока:

EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    // do something.
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

По-видимому, эта конструкция очереди отправки не только рекомендуется, она в основном необходима. Это, пожалуй, самый шумный способ, который я когда-либо видел на любом языке, который выталкивал лямбду в очередь сообщений. Но вот оно. Это java. И в защите Java, безусловно, очевидно из того, что именно происходит. Я перепугаю количество ввода, но единственное, что я могу придумать, - это избежать макросов препроцессора C, и я уверен, что людям Java не нравится использовать их. Расширение кода с помощью шаблонов более читаемо, поддерживается и не связано с черной магией.