[英]JFrame not updating before thread.sleep()
我正在使用GUI和JFrames / JPanels創建棋盤游戲,您可以在計算機上玩該游戲。 我有一個名為showPieces()的方法,該方法通過更改按鈕數組(以網格格式布置)上的圖像圖標來更新板子GUI。 圖標更新后,將使用revalidate()
和repaint()
方法來更新GUI。 showPieces()方法具有一個參數,每次調用它時都需要將其傳遞給它。
我遇到的主要問題是,我希望人類采取行動,更新GUI,等待1秒鍾,計算機使之運動,然后循環直到有人獲勝。 我的基本代碼如下:
do{
human.makeMove();
gui.showPieces(data);
try {
Thread.sleep(1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
computer.makeMove()
gui.showPieces(data);
}while(playing);
這會導致以下問題:當人類玩家進行移動時,GUI將凍結一秒鍾,然后在延遲之后,兩個移動將同時進行。
我希望這是有道理的,但是我是Java的新手,可能由於我不太了解它而不得不更多地研究線程。
Thread.sleep()是在事件分配線程上完成的,它將鎖定GUI。
因此,如果您需要等待特定的時間,請不要在事件分發線程中休眠。 而是使用計時器 。
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//...Perform a task...
}
};
new Timer(delay, taskPerformer).start();
與大多數其他類似的Swing問題一樣,您可以通過在GUI的事件線程(EDT或事件調度線程)上調用Thread.sleep(...)
來使整個Swing GUI進入睡眠狀態,並且在此期間,GUI何時無法更新其圖像或與用戶進行任何互動。 這里的解決方案不是使用Thread.sleep(...)
,而是使用Swing Timer導致您的1秒延遲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.