2014-11-07 3 views
1

У меня проблема с куском моего кода на Java, похоже, создается бесконечный цикл.Проблемы с Java Swing Timer и бесконечными циклами

public void progress(){ 
    x = 3; 

    timer = new Timer(800, new ActionListener() { 
      public void actionPerformed(ActionEvent evt){ 
       System.out.println(x); 
       x--; 

       if(x < 1){ 
        UI(); 
        timer.stop(); 
       } 
      } 
     }); 

    timer.start(); 
} 

Метод UI запрашивает ввод через SavichIn, и он, похоже, не запускает линию. Я печатаю перед тем, как я попрошу ввести его в пользовательский интерфейс, и печать работает просто отлично. Когда я удаляю этот таймер из своего кода и сохраняю метод UI одинаковым, он отлично работает. Печатает, а затем берет ввод. Я также добавил timer.stop() в методе пользовательского интерфейса, и я уверен, что таймер остановлен, однако после запуска программы я вынужден перезагрузить виртуальную машину в следующий раз, иначе она не будет запущена. Любая помощь приветствуется!

+0

попытка timer.stop(); Пользовательский интерфейс(); –

+0

Ваш метод 'UI()' вероятно, должен вызываться в фоновом потоке. –

ответ

2

Вероятно, ваш метод UI() должен быть вызван в фоновом потоке, поскольку он, вероятно, связывает поток событий Swing (это мы должны угадать, так как вы его не показываете). Поэтому создайте SwingWorker или фоновый поток и выполните этот вызов. Подробнее об этом читайте Concurrency in Swing.

например,

public void progress() { 
    x = 3; 

    timer = new Timer(800, new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     System.out.println(x); 
     x--; 

     if (x < 1) { 
      new Thread(new Runnable() { 
       public void run() { 
       UI(); 
       } 
      }).start(); 
      timer.stop(); 
     } 
    } 
    }); 

    timer.start(); 
} 
Смежные вопросы