Как я могу сделать паузу / сон / ожидание в приложении Java Swing? - PullRequest
0 голосов
/ 25 февраля 2019

Я создаю анимацию, используя JLabel,

public void updateLabels() {
      label.setIcon(new ImageIcon(new Paint().getScaledImage(paint[currentIndexLabel].imageCALA,300,300)));
      label_1.setIcon(new ImageIcon(new Paint().getScaledImage(paint[currentIndexLabel].imageStates,300,300)));
      label_2.setIcon(new ImageIcon(new Paint().getScaledImage(paint[currentIndexLabel].imageStrategies,300,300)));
      label_3.setIcon(new ImageIcon(new Paint().getScaledImage(paint[currentIndexLabel].imagekD,300,300)));

      currentIndexLabel++;
}

, и у меня есть кнопка, которая обновляет метки

btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        while (currentIndexLabel != paint.length-1) {
            updateLabels();
        }
    }
});

Но я не знаю, как ждать,скажем, например, 1000 мс, до следующего изменения.Когда я добавляю это:

try { Thread.sleep(1000); } catch (Exception e){}

в мой ActionListener:

btn.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent arg0) {
           while (currentIndexLabel!=paint.length-1) {
             updateLabels();
             try { Thread.sleep(1000); } catch (Exception e){}
       }
    }
 });

это не работает.Это просто остановилось на некоторое время, и я не вижу изменений между первым и последним кадрами.Можно ли подождать 1000 мс без остановки программы?Когда я удаляю цикл while и пробую раздел и нажимаю кнопку, он меняется довольно хорошо ...

Как я могу это сделать?

1 Ответ

0 голосов
/ 25 февраля 2019

Использование метода Thread#sleep в приложениях Swing в потоке main приведет к зависанию графического интерфейса пользователя (поскольку поток спит, события не могут происходить).Метод Thread#sleep в приложениях Swing разрешается использовать только SwingWorkers , и это в их методе #doInBackround.

Для того, чтобы ждать в приложении Swing (или сделать что-топериодически), вам придется использовать таймер Swing. Взгляните на сделанный мной пример:

import java.awt.FlowLayout;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer; //Note the import

public class TimerExample extends JFrame {
    private static final int TIMER_DELAY = 1000;
    private Timer timer;

    public TimerExample () {
        super();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(200, 200);
        setLocationRelativeTo(null);
        getContentPane().setLayout(new FlowLayout());

        timer = new Timer(TIMER_DELAY, e -> {
            System.out.println("Current Time is: " + new Date(System.currentTimeMillis()));
        });
        //timer.setRepeats(false); //Do it once, or repeat it?
        JButton button = new JButton("Start");
        button.addActionListener(e -> timer.start());
        getContentPane().add(button);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new TimerExample().setVisible(true));
    }
}

Вывод после нажатия кнопки «Пуск»:

Текущее время: пн 25 февраля 13:30:44 EET 2019

Текущее время: пн 25 февраля 13:30:45 EET 2019

Текущее время: пн25 февраля 13:30:46 EET 2019

Как вы можете видеть, слушатель действия Timer срабатывает каждую секунду.

Итак, в вашем случае:

timer = new Timer(TIMER_DELAY, e -> {
    if (currentIndexLabel != paint.length-1) {
        upateLabels();
        timer.restart(); //Do this check again after 1000ms
    }
});
button.addActionListener(e -> timer.start());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...