2017-10-15 116 views
0

我正在在我应该做的标签知名度假之后,也就是说,1秒的时间间隔 程序是相当漫长和复杂的报价,所以我解释它的程序后,标签不可见。我有每一个标签是调用setVisible时间(假)标签的阵列,并且,执行SLP()方法。制作了一段时间的NetBeans

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

但是我面临一个问题。该方法只是增加线程的执行时间,最后所有的标签都变得不可见。我需要动画效果,那不是即将到来的。 什么是解决我的问题的好方法?计时器可以为我服务吗?

+0

你需要在新线程中运行1秒等待。 – cello

+0

能否请你告诉我,我该怎么做呢? –

回答

0

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

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

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

总之,代码看起来是这样的:

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(); 
} 

的代码可以进一步“清理”通过使用从Java 8拉姆达表达式为可用:

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

它不工作。除了我没有将标签作为参数之外,我使用了第一个代码。这是全球性的,所以我直接提到它。但现在,它似乎甚至没有输入slp()。 –

+0

上面的代码会在1秒后隐藏标签。如果它不适合你,那么你的代码中一定有其他错误。请发布[mcve],以便我们可以帮助您而不是猜测。 – cello