我这样启动我的GUI,这似乎是正确的。

  javax.swing.SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            JFrame gui = new JFrame();
            gui.setExtendedState(JFrame.MAXIMIZED_BOTH);
            gui.setVisible(true);
        }
    });


在应用程序中的某个点,将触发playTurn()方法。 for循环会在列表中轮流显示。

 for (String turn : controller.getTurns()) {
                playTurn(turn);
            }


现在,我用CardLayout加载了正确的面板,效果很好。然后,我不得不编写playTurn()方法。因此playTurn()被调用。它应该根据一些变量来做某些事情。但是,除非禁用某些按钮,否则它不会返回。这是我无法实现的,程序只是停止工作。我可以猜测它是朝线程等方向发展的。但是似乎无法弄清楚。提前致谢。

public void playTurn(String turn) {
    if (controller.givePlayers().contains(turn)) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                while (!turnFinished) {
                    if (!button1.isEnabled() && !button1.isEnabled() && !button1.isEnabled() && !button1.isEnabled()) {
                        turnFinished = true;
                    }
                }
            }
        });
    } else {
        deletePlayer(turn);
    }
}


抱歉,格式化错误。找不到位置。

编辑:
GUI停止响应。也无法关闭程序。
我尝试使用SwingWorker一段时间,它不会阻塞GUI,但playTurn()返回。

我什至尝试创建一个新线程来调用该方法。不再被阻止,但方法仍然返回。

Thread one = new Thread() {
                    public void run() {
                        playTurn(turn);
                    }
                };


修正:将可运行物品放到更高的位置;

最佳答案

您的playTurn方法在EDT上运行代码,这是该行javax.swing.SwingUtilities.invokeLater(new Runnable() {的原因,这使您的应用程序GUI无法响应,因为通常在EDT上必须运行更改GUI的代码。由于按钮不会从GUI更改,因此一旦循环开始,它可能永远循环下去。

通过在另一个Thread中运行代码,您将不会冻结GUI。我猜,由于您没有在其余代码中提供太多信息,因此一旦循环完成,您可能必须更改处理事情的方式。

从注释中编辑:由于您不希望playTurn返回,因此请勿在其中使用线程,并确保playTurn不在EDT上运行。创建并制作新的playTurn运行代码后,您的Thread方法将返回。

您可能想要尝试像这样:

Runnable code = new Runnable() {
  @Override
  public void run() {
    for (String turn : controller.getTurns()) {
      playTurn(turn);
    }
  }
};

if (!SwingUtilities.isEventDispatchThread()) {
  code.run();
} else {
  new Thread(code).start();
}


为了确保您没有在EDT上运行代码。这样,playTurn直到满足循环条件时才返回,GUI保持响应。

public void playTurn(String turn) {
  if (controller.givePlayers().contains(turn)) {
    while (!turnFinished) {
      if (!button1.isEnabled() && !button1.isEnabled() && !button1.isEnabled() && !button1.isEnabled()) {
        turnFinished = true;
      }
    }
  } else {
    deletePlayer(turn);
  }
}


这样做可能会让您做出更多更改。

想法是对新的Thread进行调用,而不希望/不需要它等待在新的Thread中运行的代码结束以继续。

08-05 21:28