SwingUtilities.invokeLater () - PullRequest
       13

SwingUtilities.invokeLater ()

4 голосов
/ 15 мая 2011

В моем методе doWork () я вызываю

SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.red);
}
});

, затем я вызываю

SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.blue);
}
});

Вопрос, будет ли кнопка красной, а затем синей или синей, а затем красной?

Ответы [ 3 ]

11 голосов
/ 15 мая 2011

invokeLater() добавляет свой параметр в очередь событий Swing.поэтому они будут выполнены в том порядке, в котором они были добавлены, т.е. сначала красным, а затем синим.

0 голосов
/ 15 мая 2011

На самом деле, у вас могут быть проблемы с перерисовкой самой кнопки.

IIRC, setBackground() просто изменит фоновое поле и вызовет событие перерисовки (вызвав repaint()).Но реальная перекраска не произойдет сразу же, даже если вызов в EDT.Вместо этого он отправит событие рисования, которое будет обработано позже (и, возможно, агрегировано с другими событиями рисования).

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

Например, если вы поставили sleep() между ними, вы, вероятно, увидите оба цвета: сначала красный , затем синий .

0 голосов
/ 15 мая 2011

Насколько я понимаю, документы , это должно быть red, а затем blue, так как первое событие добавляется в очередь событий (ну ..) сначала.

...