Активное обновление во время циклов - PullRequest
2 голосов
/ 02 января 2012

Каждый раз, когда я делаю код, включающий цикл 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
}

Ответы [ 3 ]

4 голосов
/ 02 января 2012

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

3 голосов
/ 02 января 2012

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

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

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

  3. использование Runnable @ Thread

2 голосов
/ 02 января 2012

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

...