JFrame白色并且反应迟钝

问题描述:

我在编写一个名为“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

while循环阻塞了您的UI线程。在不同的线程中执行while循环检查。

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

这样你的用户界面不会被阻止,控件仍然会响应。

正如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();