簡體   English   中英

JButtons不會立即更改鼠標事件

[英]JButtons don't imediatly change on mouse event

我正在使用java swing庫開發一個稱為DAO的棋盤游戲。

問題在於,在人類玩家移動其動作之后,通過單擊帶有他要播放的棋子圖像的JButton,我調用了計算機AI例程,但在鼠標事件函數內部。 通過僅在函數返回時執行此操作,計算機才結束旋轉,JButton執行刷新圖像(setIcon進來)。

我想知道如何在單擊JButton時(不僅是在鼠標事件函數結束時)強制JButton更改其圖像(因為我需要處理其中的數據)。

我已經嘗試了所有這些

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

沒有用。

Thx提前

所有Swing活動都使用一個線程。

這是過程。

  • 一個事件出現在事件隊列中
  • 它從隊列中拉出並由AWT線程執行
  • 執行此操作時創建的任何新事件都將保留在隊列中,直到當前運行的AWT事件返回為止。
  • 執行事件返回,隊列中的下一個事件出隊並執行。

這意味着,如果您需要執行花費超過1/100秒左右的時間的任何操作,則不應執行任何從swing事件開始的線程。 而是生成自己的線程,並將擺動線程返回給系統,以便可以更新GUI。

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

幾乎可以肯定,新Java程序員不遵守此規則並在AWT線程上執行任務是人們認為Java速度慢的最大原因。

您可能希望嘗試將單擊JButton執行的操作放入Swing工作器中。 這將允許任務在后台繼續,而用戶仍然可以單擊其他按鈕等。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM