java - JFrame 白色且无响应,带有 while 循环

标签 java

我在编写一款名为“Coup”的游戏时遇到了麻烦,为了解释问题所在,我需要简要解释一下游戏的内容。 Coup 是一款纸牌游戏,玩家试图消灭对方并成为最后剩下的玩家。为此,玩家可以选择多种行动,但他们也可以对其他玩家撒谎。在这个游戏中,其他玩家可以骂“废话”或者阻止其他玩家的行动。因此,我需要制作响应窗口,让其他玩家可以通过挑战、阻止或不执行任何操作来响应。操作的结果取决于响应。例如,一名球员试图获得外援。我可以决定阻止他的行动或让他继续。如果我阻止会有后果,但这不是这里的问题。

真正的问题是这样的:我想给所有玩家一个机会通过 JFrame 给出响应(阻止或不执行任何操作),并且我使用 while 循环来等待所有玩家响应。然而,这个 while 循环除了阻止方法继续进行之外不执行任何操作,因为结果取决于玩家的 react 。使用 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());
        }

运行这部分代码得到的结果是: “不适用 无效的 不适用 不适用" 不断地。我使用 null 来代表尚未回答的玩家。在该方法结束时,我将所有玩家能力重置回空。

我的响应窗口要做的就是将玩家的响应从 null 更改为“B”或“N”。但如果无法访问按钮,我就无法做到这一点。除了使用 while 循环之外,有人对如何使用某些东西“暂停”我的线程有任何提示吗?

最佳答案

正如 Abdul Fatir 提到的,这是因为 UI 线程被阻塞。

但是我不建议直接搞乱线程。有一个SwingWorker完全适合这种情况的类,建议您使用它。

有关更多信息,请查看此博客文章 - Swing Worker Example

您还可以在以下问题中找到一些有用的信息 - 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();

关于java - JFrame 白色且无响应,带有 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57841825/

相关文章:

java - 使用对象实现 LruCache

java - 我的 Spring Boot 中的事务出现问题 - 我遇到异常,但事务正在提交

java - Eclipse 安装程序找不到 Java

java - Java 中加密和解密文本文件的 key

java - Redisson:在finalize方法中关闭客户端

java - 在 Java 中声明 lambda 数组

java - 如何编写比较器的 equals()

java - 计算函数的总和

java - 如何在另一个类中的 JPanel 类中实现 ActionListener?

java - 将 JSON 反序列化为 Map<String, Object>,并为每个属性提供回调