我正在尝试显示图像(iconLabel4)5秒钟,然后在其上显示另一个图像(imageLabel)。为什么代码不按预期工作?
当我运行时,会发生什么:我按下“沐浴”按钮,没有任何反应。
我将不胜感激任何帮助!谢谢。
代码:
JButton bathe = new JButton("Bathe");
bathe.setBounds(370, 450, 80, 25);
bathe.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent event){
long startTime=System.currentTimeMillis();
String actionCommand = event.getActionCommand();
if (SHOW_ACTION.equals(actionCommand)){
while (System.currentTimeMillis() - startTime < 5000) {
iconLabel4.setVisible(true);
} }
iconLabel4.setVisible(false);
imageLabel.setVisible(true);
repaint();
};
});
bathe.setActionCommand(SHOW_ACTION);
panel.add(bathe);
答案 0 :(得分:2)
不要使用while
循环进行计时。使用javax.swing.Timer
。点击How to Use Swing Timers了解更多信息。这是基本构造
Timer (int delayInMillis, ActionListener listener)
其中delayInMillis
是&#34; ticks&#34;之间的毫秒延迟。每个刻度都会触发ActionEvent
,就像按下按钮一样。所以你传递给计时器的监听器有actionPerformed
方法,每次打勾都会被调用。
只需使用一个 JLabel
和两个ImageIcons
。当您尝试将组件设置为可见且在看见容器后不可见时,您需要revalidate()
和repaint()
容器。但这不是正确的做法。只需使用一个标签,并在想要更改图标时使用方法JLabel.setIcon(ImageIcon)
。
不要使用空布局。学习使用布局管理器,让他们为您做定位。详情请见Laying out Components Within a Container
答案 1 :(得分:0)
只是一个建议, 可以 使用Thread.sleep(5000)
。
注意事项: Thread.sleep()不准确。不准确程度取决于底层操作系统及其计时器和调度程序。我经历过并行进行垃圾收集会导致睡眠过度。 - StackOverflow
但如果你不介意在这里和那里几毫秒,那就更容易了。