gpt4 book ai didi

java - 如何在 java swing 应用程序中暂停/ sleep /等待?

转载 作者:行者123 更新时间:2023-12-01 07:00:48 24 4
gpt4 key购买 nike

我正在使用 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){}
}
}
});

它不工作。它只是停止了一段时间,我没有看到第一帧和最后一帧之间的变化。是否可以等待1000ms而不停止程序?当我删除 while 循环和 try 部分,然后单击我的按钮时,它变化得很好......

我该怎么做?

最佳答案

线程中的swing应用程序中使用Thread#sleep方法将导致GUI卡住(由于线程 hibernate ,事件无法发生)。 swing应用程序中的Thread#sleep方法仅允许SwingWorkers使用,这在他们的 #doInBackround 方法中。

为了在 swing 应用程序中等待(或定期执行某些操作),您必须use a Swing Timer.看看我做的一个例子:

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));
}
}

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

Current Time is: Mon Feb 25 13:30:44 EET 2019

Current Time is: Mon Feb 25 13:30:45 EET 2019

Current Time is: Mon Feb 25 13:30:46 EET 2019

正如您所看到的,Timer 的 Action 监听器每秒都会触发一次。

所以在你的情况下:

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 - 如何在 java swing 应用程序中暂停/ sleep /等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54865088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com