使用Ticks in actionPerformed - 如何显示图像5秒钟

时间:2014-05-27 23:42:42

标签: java image swing jpanel actionlistener

我正在尝试显示图像(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);

2 个答案:

答案 0 :(得分:2)

  1. 不要使用while循环进行计时。使用javax.swing.Timer。点击How to Use Swing Timers了解更多信息。这是基本构造

    Timer (int delayInMillis, ActionListener listener)
    

    其中delayInMillis是&#34; ticks&#34;之间的毫秒延迟。每个刻度都会触发ActionEvent,就像按下按钮一样。所以你传递给计时器的监听器有actionPerformed方法,每次打勾都会被调用。

  2. 只需使用一个 JLabel和两个ImageIcons。当您尝试将组件设置为可见且在看见容器后不可见时,您需要revalidate()repaint()容器。但这不是正确的做法。只需使用一个标签,并在想要更改图标时使用方法JLabel.setIcon(ImageIcon)

  3. 不要使用空布局。学习使用布局管理器,让他们为您做定位。详情请见Laying out Components Within a Container

答案 1 :(得分:0)

只是一个建议, 可以 使用Thread.sleep(5000)

注意事项: Thread.sleep()不准确。不准确程度取决于底层操作系统及其计时器和调度程序。我经历过并行进行垃圾收集会导致睡眠过度。 - StackOverflow

但如果你不介意在这里和那里几毫秒,那就更容易了。