2011-04-22 162 views
1

我有這個學校項目,我需要讓我的代碼隱藏一個按鈕,然後睡覺,然後繼續,但它永遠不要隱藏按鈕。隱藏按鈕,然後等待2秒後再次顯示,點擊按鈕後

我有一個類是由一個按鈕啓動的,然後啓動另一個應該隱藏按鈕的方法,然後在另一個類中啓動一個方法,執行一堆完美的事情,然後它在第三堂課中開始第三種方法,第一課應該做的是睡覺,但在隱藏我的按鈕之前睡覺,並完全跳過隱藏我的按鈕。

這裏是代碼的一部分(不介意丹麥值/方法名):

public void turncard(final int navn,boolean spiller){ 
    knap.setVisible(false); 
    EqualCheck.storevalue(this,spiller); 
} 

我知道這部分被包圍,如果..但是它可以這樣調用。

if(spiller){     //tester om det er spilleren der har vendt kort, 
    kort.repaint();    //og hvis det er, så starter den computerens 
    Main.spillet.computertur(); //tur. 
} 

,然後在「computertur」方法開始

public void computertur() { 
    for(int i = 0; i < kortene.size(); i++) { 
     kortene.get(i).knap.setEnabled(false); 
    } 
    try { 
     Thread.sleep(2000); 
    } catch (Exception e) { 
     System.out.println("sleep failed."); 
    } 

我讀過有關invokeAndWait命令,它應該是EDT更好:S,但我怎麼可以用它來暫停mythread ...甚至更好的問題,爲什麼它不隱藏按鈕? :)我的意思是,在我的腦海裏,在任何其他事情都會在它做任何事情之前將其隱藏起來之前,調用setVisible(false) ..爲什麼不呢?

+1

不應該最後一個示例代碼調用setVisible(false)而不是setEnabled(false)嗎? setEnable只是禁用了不可點擊的按鈕,它不會隱藏它。 – Jberg 2011-04-22 17:43:06

+0

設置啓用是爲了使用戶無法在執行cumputertur()時點擊按鈕,最終撤消setEnable(false).. :) – Kezides 2011-04-22 19:01:09

回答

2

在執行事件調度線程(EDT)上的代碼時,永遠不要調用Thread.sleep(...)。這會凍結GUI並阻止它重新繪製iteself。

通常,您的代碼需要在單獨的線程上執行,除了將該按鈕設置爲不可見的代碼之外。請閱讀Swing教程Concurrency中的部分以獲取更多信息和解決方案。

+0

invokeAndWait()是有用的,但我只是不能看到如何在我的情況下使用它,因爲它需要隱藏我的按鈕之後才能做的事情。 – Kezides 2011-04-22 18:47:21

+0

您應該可能不使用invokeAndWait()。你應該創建一個新的線程來運行你的任務。當線程啓動時,你使用invokeLater(...)來禁用按鈕。你使用Thread.sleep()。然後你使用invokeLater來啓用按鈕。 – camickr 2011-04-23 03:52:22

+0

啊..我看..我會盡力..謝謝.. :) – Kezides 2011-04-23 11:30:15

相關問題