我正在开发一个简单的Swing程序,该程序将一个标签放置在框架上,休眠一秒钟,然后将另一个标签放置在框架上,如下所示:
import javax.swing.*;
import java.util.concurrent.*;
public class SubmitLabelManipulationTask {
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame("Hello Swing");
final JLabel label = new JLabel("A Label");
frame.add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 100);
frame.setVisible(true);
TimeUnit.SECONDS.sleep(1);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setText("Hey! This is Different!");
}
});
}
}
但是,我无法在睡觉前在屏幕上看到第一个标签。睡眠时屏幕空白。之后,我会立即看到原始标签,然后立即看到最终标签“嘿!这不一样!”。在屏幕上。为什么原始标签没有出现在JFrame上?
最佳答案
使用Swing计时器代替睡眠代码会更好,更安全,因为睡眠调用可能会在事件线程上完成,这会使整个GUI进入睡眠状态,而不是您想要的。您还需要注意确保GUI实际上确实在Swing事件线程上启动。例如
import javax.swing.*;
import java.util.concurrent.*;
public class SubmitLabelManipulationTask {
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Hello Swing");
final JLabel label = new JLabel("A Label", SwingConstants.CENTER);
frame.add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 100);
frame.setVisible(true);
Timer timer = new Timer(1000, e -> {
label.setText("Try this instead");
});
timer.setRepeats(false);
timer.start();
});
}
}
关于java - JLabel在休眠前没有出现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43049730/