Несколько дополнительных советов, в дополнение к тому, что сказал Эдралзар:
Вы можете использовать вспомогательный метод SwingUtilities.isEventDispatchThread()
, чтобы проверить, действительно ли код выполняется в потоке диспетчеризации событий. И, как сказал edralzar, любой код, который создает компоненты GUI, изменяет состояние компонентов GUI или считывает состояние компонентов GUI, должен выполняться в потоке диспетчеризации событий.
Однако следует учитывать и то, что код , работающий на EDT, должен иметь возможность довольно быстро выполняться . Таким образом, вы не можете просто решить проблемы, запустив все в потоке отправки событий. Если вы сделаете следующее, ваш графический интерфейс будет заморожен на пять секунд:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
try{
Thread.currentThread().sleep(5000);
}catch(InterruptedException e){
//Ignored in this example
}
}
});
Почему он заморожен? Поскольку все события GUI и обновления GUI выполняются в EDT, и если EDT спит в течение 5000 миллисекунд, обновления GUI в течение этого времени не могут быть выполнены.
Эта статья может быть интересным чтением.