一段时间后NetBeans使标签不可见

时间:2017-10-15 17:42:38

标签: java timer thread-sleep

我正在制作一个程序,我应该在1秒间隔之后让标签看不见 这个程序很长很复杂,所以我在解释它。我有一个标签数组,每次标签是setVisible(false),执行slp()方法。

public void slp() 
{
    try{
        Thread.sleep(1000);
    }
    catch(Exception e)
            {
                System.out.println(e);
            }
}

但是我遇到了一个问题。该方法只增加了执行线程的时间,所有标签最终都变得不可见。我需要动画效果,而这还没有到来。 什么是我的问题的一个很好的解决方案?计时器能为我服务吗?

1 个答案:

答案 0 :(得分:0)

首先,您的方法slp应该以{{1​​}}作为参数,因此您可以修改特定标签的可见性。否则,该方法将不知道要隐藏哪个标签。

其次,为了不阻塞主线程(或类JLabel的任何线程),slp()应该在自己的线程中运行。这就是为什么下面的代码使用Thread.sleep(1000)来创建一个可以完成实际工作的新线程的原因。

第三,由于现在等待处于单独的线程中,因此必须在Swing Events线程上再次更改标签可见性。为此,我们使用SwingUtilities.invokeLater()然后设置标签的可见性。

总之,代码看起来像这样:

new Thread(....).start();

代码可以进一步清理"通过使用自Java 8以来可用的lambda表达式:

public void slp(JLabel label) {
    new Thread(new Runnable() {
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    label.setVisible(false);
                }
            });
        }
    }).start();
}