Компоненты Swing не являются поточно-ориентированными.Все, что изменяет компонент Swing после того, как оно уже показано, должно выполняться в так называемом потоке диспетчеризации событий (EDT).Для этого Swing предоставляет вам следующие функции:
Две из них служат для выполнения кода:
SwingUtilities.invokeLater(Runnable)
SwingUtilities.invokeAndWait(Runnable)
Их назначение исходит из их названия.Третье - это
SwingUtilities.isEventDispatchThread()
Если это возвращает true
, то вы уже в EDT и можете выполнять код напрямую.
Обратите внимание, что invokeAndWait
вызовет исключение, еслион вызывается напрямую из EDT (invokeLater
не будет, но делать это не рекомендуется), поэтому код, который можно вызывать как из EDT, так и из бокового потока, должен быть записан следующим образом:
if (SwingUtilities.isEventDispatchThread()) {
// code
} else {
SwingUtilities.invokeLater(new Runnable () {
public void run () {
// code
}
});
}
В целях простоты и удобочитаемости вы можете извлечь внутренний код для метода.