JFrame白色且没有响应while while循环

时间:2016-05-30 19:56:50

标签: java

我正在编写一款名为" Coup"并解释问题所在,我需要简要解释一下游戏的内容。政变是一种纸牌游戏,玩家试图消灭对方并成为最后一名玩家。要做到这一点,玩家可以选择一些动作,但也可以欺骗其他玩家。在这个游戏中,其他玩家可以打电话给#34;废话"或阻止其他玩家行动。因此,我需要制作响应窗口,让其他玩家以挑战,阻挡或无所事事作出回应。然后,操作的结果取决于响应。例如,玩家试图获得外援。我可以决定阻止他的行动或让他继续。如果我阻止会有后果,但这不是问题。

真正的问题在于:我希望让所有玩家都有机会通过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());
        }

运行这部分代码得到的结果是: &#34; NA 空值 NA NA&#34; 不断。我使用null来表示尚未回答的玩家。在方法结束时,我将所有玩家的能力重置为空。

我的所有响应窗口都会将玩家的响应从null更改为&#34; B&#34;或&#34; N&#34;。但是如果没有按钮,我就无法做到这一点。有没有人对如何使用某些东西有任何提示&#34;暂停&#34;我的线程除了使用while循环?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

while循环阻止了您的UI线程。在另一个Thread中执行while循环检查。

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

这样您的用户界面就不会被阻止,控件也会保持响应状态。