我正在制作一个程序,我应该在1秒间隔之后让标签看不见 这个程序很长很复杂,所以我在解释它。我有一个标签数组,每次标签是setVisible(false),执行slp()方法。
public void slp()
{
try{
Thread.sleep(1000);
}
catch(Exception e)
{
System.out.println(e);
}
}
但是我遇到了一个问题。该方法只增加了执行线程的时间,所有标签最终都变得不可见。我需要动画效果,而这还没有到来。 什么是我的问题的一个很好的解决方案?计时器能为我服务吗?
答案 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();
}