SwingUtilities.InvokeLater и ButtonListeners - PullRequest
0 голосов
/ 26 октября 2018

просто вопрос про 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        
}

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

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

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

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

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

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

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

0 голосов
/ 26 октября 2018

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...