Работает для меня, что заставляет меня думать, что это проблема EDT. Переместите ваш вызов на setVisible
до конца основного метода.
По этой ссылке: http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
Этот метод является потокобезопасным, хотя большинство методов Swing - нет.
Графический интерфейс приложения часто можно создать и показать в основном потоке: следующий типичный код безопасен, если не реализованы никакие компоненты (Swing или иным образом):
public class MyApplication {
public static void main(String[] args) {
JFrame f = new JFrame("Labels");
// Add components to
// the frame here...
f.pack();
f.show();
// Don't do any more GUI work here...
}
}
Весь код, показанный выше, выполняется в «основном» потоке. Вызов f.pack () реализует компоненты в JFrame. Это означает, что технически вызов f.show () небезопасен и должен выполняться в потоке диспетчеризации событий. Однако до тех пор, пока программа не имеет видимого графического интерфейса, крайне маловероятно, что JFrame или его содержимое получит вызов paint () до возврата f.show (). Поскольку после вызова f.show () код GUI отсутствует, вся работа с GUI перемещается из основного потока в поток диспетчеризации событий, а предыдущий код на практике является поточно-ориентированным.