如何在Java Swing应用程序中暂停/睡眠/等待?

我正在使用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循环并尝试部分时,单击我的按钮,它的变化非常好…

我怎样才能做到这一点?

回答:

Thread#sleep在 线程中的swing应用程序中使用method

会导致GUI冻结(因为该线程处于睡眠状态,因此无法发生事件)。Thread#sleepSwing应用程序中的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));

}

}

按下“开始”按钮后的输出:

当前时间是:2019年2月25日星期一13:30:44

当前时间是:EET 2019星期一2月25日13:30:45

当前时间是:EET 2019星期一2月25日13:30:46

如您所见,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());

以上是 如何在Java Swing应用程序中暂停/睡眠/等待? 的全部内容, 来源链接: utcz.com/qa/418933.html

回到顶部