我正在编写一个java swing的迷你游戏。我已经设置了GUI,游戏涉及一系列数字在屏幕上闪烁然后消失 - 用户必须按照它们出现的顺序再次输入数字。
当数字最初显示时,我希望它们显示1-2秒,然后消失,并有另一个数字1-2秒等。
但是,当数字显示时,我遇到延迟程序的问题。我不能使用Thread.sleep,因为它暂停了以前的数字等暂停整个程序。它只是不起作用。我已经尝试过我遇到的所有其他建议,其中没有一个已经有效。
任何人都有提示吗?
int delay = 5000; // delay in milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) { //...Perform a task... } };
Timer timer = new Timer(delay, taskPerformer);
timer.setRepeats(false);
timer.start(); // timer starts - after delay time your task gets executed
你可以使用Thread.sleep()
您遇到的问题可能是因为您正在尝试从Swing的事件调度线程更新UI。这是一个为Swing组件保留的线程,除了对UI的快速更新外,您应该完全不做任何事情。
public void prog() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
label.setText("1");
}
}
try {
Thread.sleep(5000);
} catch(Exception e) { }
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
label.setText("2");
}
}
}
public static void main(String[] args) {
label = new JLabel("0");
prog();
}
JLabel label
UI应该保持响应,因为它的组件交互应该在ActionListener中实现。但是如果你想在等待时执行其他工作,或者如果该功能包含在ActionListener的actionPerfomed()方法中,则可以启动新线程以休眠5秒然后更新UI。您还可以执行一些计算,这些计算需要5秒才能计算而不是在不阻塞UI的情况下进行休眠。代码是:
(new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (Exception e) { }
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
label.setText("2");
}
}
}
}).start();