Это происходит постоянно, если вы не программируете внимательно в AWT / Swing.
Прежде всего, вы должны ВСЕМ работать с потоком событий. Это означает, что вы не можете сделать ничего из этого в своем основном утверждении (или что-то, что он вызывает напрямую). Я знаю, что каждое приложение Java с графическим интерфейсом нарушает это правило, но это правило.
В большинстве случаев они говорили, что вы можете использовать не-awt-поток, пока окно не будет "реализовано" (pack / setVisible), но Sun выяснило, что это не всегда работает.
Во-вторых, когда вы получаете событие в потоке AWT, обязательно верните его быстро. Никогда не спите и не выполняйте длительную операцию.
В-третьих, (и это расширение «Первый», если вы получаете обратный вызов, который НЕ находится в рабочем потоке AWT, обязательно поместите его в поток AWT, прежде чем делать что-либо с GUI.
Как правило, любое событие, генерируемое компонентом AWT, будет в правильном потоке. События, сгенерированные таймерами, созданными вручную потоками или передаваемыми в main (), не являются.