GUI не отображается, когда поток находится в процессе в JAVA - PullRequest
2 голосов
/ 10 ноября 2011

Я делаю простую игру с очень простым потоком (задержка 1 сек), возникла проблема с потоком, у меня есть цикл while(true) с кодом:

try {
    while (true) {
       Ltimer.setText(getTimeElapsed());
       Thread.currentThread();
       Thread.sleep(1000); // Thread sleeping for 1 second           
    }
} catch (Exception e) {
    JOptionPane.showMessageDialog(null, "error with timer");       
} 

он просто получает строку каждую секунду иобновляет текст метки, когда я пытаюсь запустить его, и я вижу только ярлык на черном фоне, все кнопки и bg img исчезли.пытался исправить с помощью setVisible() repaint(), но ничего не получил ..

какие-либо другие варианты?

Ответы [ 4 ]

5 голосов
/ 10 ноября 2011

не используйте Thread#sleep(int) во время EDT, тогда у вас есть проблема с Concurency в Swing , если вам нужно отложить какое-либо действие, используйте java.swing.Timer , например для EDT не хватает здесь

2 голосов
/ 10 ноября 2011

Вы не можете использовать компоненты Swing вне потока отправки событий. Смотри http://download.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading

Используйте SwingUtilities.invokeLater каждый раз, когда ваш поток должен что-то изменить в пользовательском интерфейсе. Или используйте Swing Timer .

Если этот бесконечный цикл фактически находится в EDT, то он блокирует все события пользовательского интерфейса, перерисовки и т. Д. Во время работы. Поэтому вы должны запустить этот цикл в отдельном потоке.

2 голосов
/ 10 ноября 2011

Полагаю, вы используете поток событий GUI для этого. Когда поток GUI связан с чем-то другим, он также не может обновлять экран. Я предлагаю вам запустить новую ветку, чтобы сделать это.

1 голос
/ 10 ноября 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...