Swingutilities.invokelater и buttonlisteners

просто вопрос о SwingUtilities.InvokeLater ().

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

то есть, должен ли я ..

    public void mouseClicked(MouseEvent e) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            //GUI updates
        }
    });
}

или я просто смогу ...

        public void mouseClicked(MouseEvent e) {
   //GUI updates        
}

Кроме того, применяется ли та же логика, если я вызываю метод объекта, который обновляет графический интерфейс?

1
0
95
2

Ответы 2

Обновление этого сообщения: Код обработки событий Swing выполняется в специальном потоке, известном как поток отправки событий. Таким образом, все действия компонентов (кнопка, флажок, переключатель и т. д.) Обрабатываются в EDT. Поэтому нет необходимости иметь SwingUtilities.invokeLater () внутри действия кнопки, поскольку оно всегда выполняется в EDT.

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

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

SwingWorker имеет методы doInBackground (), done () и process () для правильной обработки длительных задач, не влияя на графический интерфейс.

Пройдите по ссылкам ниже, чтобы получить дополнительную информацию Почему SwingUtilities.invokeLater () вызывает зависание JButton?

Что делает SwingUtilities.invokeLater?

https://www.javacodegeeks.com/2012/12/multi-threading-in-java-swing-with-swingworker.html

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

camickr 26.10.2018 16:47

any time I update my Swing interface I need to call SwingUtilities.InvokeLater to get onto the EDT

Верный. Это включает в себя любое обновление модели компонента, так как это также приведет к перекрашиванию компонента.

Does this need to be done if I am attempting to update my GUI from a button listener, as they button events are already on the EDT?

Опять правильно. Поскольку код автоматически вызывается в EDT, вам не нужно вручную добавлять его в EDT с помощью invokeLater ().

Обычно вы используете SwingUtilities.invokeLater (), если ваш код выполняется на separate Thread и часть этой логики требует обновления компонента графического интерфейса.

Другие вопросы по теме