2012-01-02 3 views
2

Каждый раз, когда я создаю код с циклом while, графический интерфейс зависает, создавая бесконечный цикл. Я хочу знать, как я могу это предотвратить. Вот пример, где я пытаюсь сделать цикл обусловливающим состояния JToggleButton, который замерзает, что делаю бесконечный цикл:Активное обновление во время циклов

boolean state = StartStop.getModel().isSelected(); //whether toggle button is on or off 
int speed = SpeedSelection.getValue(); //value of the speed selection bar 
ScrollPane.getHorizontalScrollBar().getModel().setValue(position); 

while(state == true){ 

     try { 
      Status.setText("Running..."); 
      StartStop.setText("Stop"); 
      position += speed; 
      System.out.println(position); 
      ScrollPane.getHorizontalScrollBar().getModel().setValue(position); 

      Thread.sleep(250); 
      state = StartStop.getModel().isSelected(); 
      speed = SpeedSelection.getValue(); 
      //start scrolling the scroll pane 
     } 

     catch (InterruptedException ex) { 
      Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex); 
     } 
} 

if(state == false){ 

    Status.setText("Paused."); 
    StartStop.setText("Start"); 
    //stop scrolling 
} 

ответ

4

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

2

Swing использует одиночный нить. Используйте другой поток для длительных задач. Обычно для этих задач используется SwingWorker.

3

не используют Threa#sleep(int) во время EDT, что причина, почему ваш GUI заморозить, у вас есть три варианта

  1. использование javax.swing.Timer

  2. использование SwingWorker

  3. использование [email protected]

Смежные вопросы