2017-10-15 115 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