簡體   English   中英

JFrame不在thread.sleep()之前更新

[英]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秒延遲。

Swing計時器教程

暫無
暫無

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

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