2010-05-13 36 views
0

我正在使用java swing庫開發名爲DAO的棋盤遊戲。JButtons不會在鼠標事件中發生變化

問題在於人類玩家進行移動後,通過點擊他想要玩的圖像的JButton,我稱之爲計算機AI程序,但在鼠標事件函數內。只有當函數返回時,計算機纔會結束,JButton會刷新它們的圖像(setIcon進來)。

我想知道如何強制JButtons在點擊時改變它們的圖像,而不僅僅是當鼠標事件函數結束時(因爲我需要處理其中的數據)。

我已經嘗試了所有這

    myButtons[i][j].setIcon(xIcon); 
        myButtons[i][j].revalidate(); 
        myButtons[i][j].repaint(); 
        myButtons[i][j].validate(); 

無的工作。提前

+0

不知道這次海報會不會真的接受答案。到目前爲止,他的任何其他問題的答案都沒有被接受。 – camickr 2010-05-13 23:57:59

回答

1

您可能想要嘗試將單擊JButton時執行的操作放入Swing worker中。這將允許任務在後臺繼續,而用戶仍然可以點擊其他按鈕等。

請參閱http://java.sun.com/docs/books/tutorial/uiswing/concurrency/simple.html

+0

非常感謝您的回覆我現在正在嘗試它,它似乎是最好的選擇......我有一個小問題....爲什麼這會給我一個錯誤,說「doInBackground函數中缺少返回值」如果它是空的(void看起來不工作,因爲它必須返回一個對象) SwingWorker myworker = new SwingWorker (){@Override protected void void doInBackground(){System.out.println(「ola」); }}; – 2010-05-14 23:31:29

1

THX有用於所有擺動活力單個線程。

下面是過程。

  • 一個事件出現在事件隊列
  • 它從隊列中拉出,並執行由AWT線程
  • 任何新的事件所造成,而這正在執行放置在隊列中舉行,直到目前運行AWT事件返回。
  • 事件正在執行返回並且隊列上的下一個事件將被出隊並執行。

這意味着如果你需要做任何需要超過1/100秒的任何事情,你不應該這樣做任何線程從一個swing事件開始。相反,產生你自己的線程,並返回到系統的擺動線程,使GUI可以更新。

現在,你的線程絕不能更新任何GUI對象!如果您需要更新GUI對象,請使用invokeLater將代碼放回AWT線程。

新Java程序員不遵守這條規則並且在AWT線程上執行任務幾乎肯定是人們認爲Java速度很慢的最大原因。

相關問題