2013-08-30 1 views
0

У меня проблема с этим.Java не меняет значение на интерфейсе после итератора.

Я делаю простую игру, чтобы найти номер с JDialog. Когда я нажимаю кнопку «СТАРТ», номер должен изменить его, но номер не изменяется после того, как итератор остановит его.

boolean found = False; 
Random random = new Random(); 


    for (int i = 0; i < 10 && !found; i++) { 
      try { 
       Thread.sleep(100); 
       int n = random.nextInt(10)+1; 
         lblNewLabel_1.setText(String.valueOf(n)); 

       if(n == numeroLoteria){ 
         found = true; 
         System.out.println("Encontrado numero "+n+"!"); 
       } 
         System.out.println("Iteracion "+i+"\nnumero: "+n); 
       } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
       } 

       } 
    } 

Метка, которой необходимо изменить, является lblNewLabel_1.

Я хочу изменить его на каждой итерации.

+3

Вы заблокировали EDT. Вместо этого используйте «Таймер». – johnchen902

ответ

1

Взгляните на учебник Concurency In Swing от Oracle.

пару ключевых моментов

  1. Это не рекомендуется для классов доступа в javax.swing.* из любого другого потока, чем EDT.
  2. Используйте javax.swing.SwingWorker (Java 1.3 и выше) или java.awt.SecondaryLoop (Java 7 и выше) для задач, которые необходимо обновить или взаимодействовать с вашим пользовательским интерфейсом. javax.swing.Timer может использоваться для запуска событий в будущем, но обычно не должен использоваться для выполнения каких-либо длительных задач.

EDIT Как уже упоминалось в комментариях, вы не должны блокировать EDT.

+0

SwingWorker добавлен в Java 6, но в остальном +1 – dkatzel

+0

@dkatzel вы правы, SwingWorker был добавлен в JDK в версии 1.6, но он был широко доступен (хотя я считаю неподдерживаемым) от Sun до включения в JDK. –