2016-05-30 29 views
1

我在編寫一個名爲「Coup」的遊戲時遇到了麻煩,並且要解釋什麼是問題,我需要簡單地解釋一下游戲的內容。 Coup是一款紙牌遊戲,玩家試圖消除對方併成爲最後一名玩家。要做到這一點,玩家可以選擇一些行動,但他們也可以騙別的玩家。在這場比賽中,其他球員可以打電話「廢話」或阻止其他球員的行動。正因爲如此,我需要製作迴應窗口,讓其他玩家以挑戰,封鎖或無所作爲迴應。行動的結果取決於迴應。例如,一名球員試圖獲得外援。我可以決定阻止他的行動或讓他繼續。如果我阻止,會有後果,但這不是問題。JFrame白色並且反應遲鈍

真正的問題是這樣的:我想給我的所有玩家有機會通過一個JFrame給予響應(塊或者什麼都不做),我使用while循環,等待所有玩家的響應。然而,這個while循環不會做任何事情,除非讓方法繼續前進,因爲結果取決於玩家的反應。通過while循環,我構建的JFrame顯示爲白色,並且不包含我製作的兩個按鈕。在這一點上,我甚至可以按下關閉按鈕,並且由於我所做的依賴於我的無響應窗口的while循環,它不會響應。有沒有什麼辦法解決這一問題?

if (turnCount == players[currentPlayerNum].getPlayerNum()){ 
     for(int i=0; i<players.length;i++){ 
      //If it is not the players turn and they have one or two lives, make response window 
      if (players[i].getPlayerNum() != turnCount){ 
       if (players[i].getLives() != 0){ 
        //foreignAidBlock constructs the response window 
        players[i].foreignAidBlock(turnCount); 
       } 

       else{ 
       //Not applicable since out of game/not in game 
       players[i].setResponse("NA"); 
       } 
      } 
      else{ 
      //Not applicable since out of game/not in game 
      players[i].setResponse("NA"); 
      } 
     } 

     //Idea: PAUSE TILL RESPONSES COME IN 
     while(players[0].getResponse() != null || players[1].getResponse() != null || players[2].getResponse() != null || players[3].getResponse() != null) 
     { 
      System.out.println(players[0].getResponse()); 
      System.out.println(players[1].getResponse()); 
      System.out.println(players[2].getResponse()); 
      System.out.println(players[3].getResponse()); 
     } 

結果我從運行這部分代碼得到的是: 「NA 空 NA NA 」 不斷。我使用null來表示尚未回答的玩家。在該方法結束時,我將我所有的玩家能力都重置爲空。

我的所有響應窗口都會將播放器的響應從null更改爲「B」或「N」。但沒有訪問按鈕,我不能這樣做。除了使用while循環外,有沒有人有關於如何使用某些東西來「暫停」我的線程的提示?

+0

您可以強制JFrame保持打開並處於頂部,因此阻止其他操作繼續。像一個JOptionPane也許 –

+0

更改代碼的結構。不要*循環*的條件:這阻止了用戶界面,並且它不能做它自己的東西,如渲染。相反,使用事件*將*應答到更改狀態,然後檢查條件和「做下一個適當的事情」 - 「阻塞」是邏輯的,但與特定函數內的流程無關。 – user2864740

回答

0

while循環阻塞了您的UI線程。在不同的線程中執行while循環檢查。

Thread t = new Thread(new Runnable(){...}); 
t.start(); 

這樣你的用戶界面不會被阻止,控件仍然會響應。

1

正如Abdul Fatir所說,這是因爲UI線程被阻塞。

但是,我不會推薦直接搞亂線程。有一個SwingWorker類完全適用於這種情況,並建議你使用這個。

欲瞭解更多信息查看本博客文章 - Swing Worker Example

您也可以在下面的SO問題的一些有用的信息 - How do I use SwingWorker in Java


下面是來自官方的javadoc快速使用例如:

假設我們想找到「生命的意義」並將結果顯示在JLabel中。

final JLabel label; 
    class MeaningOfLifeFinder extends SwingWorker<String, Object> { 
     @Override 
     public String doInBackground() { 
      return findTheMeaningOfLife(); 
     } 

     @Override 
     protected void done() { 
      try { 
       label.setText(get()); 
      } catch (Exception ignore) { 
      } 
     } 
    } 

    (new MeaningOfLifeFinder()).execute(); 
相關問題