Java 什么是正确的方法来实现这一点?

Java 什么是正确的方法来实现这一点?,java,multithreading,swing,user-interface,while-loop,Java,Multithreading,Swing,User Interface,While Loop,我像这样启动GUI,这似乎是正确的 javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame gui = new JFrame(); gui.setExtendedState(JFrame.MAXIMIZED_BOTH); gui.setVisible(true)

我像这样启动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 (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);
                    }
                };

固定:将runnable向上放置在堆栈中更高的位置

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

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

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

您可能想这样尝试:

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);
  }
}
这样做可能会让你有更多的改变


这样做的目的是调用一个新的
线程
,您不希望它/需要它等待代码在新的
线程
中运行结束并继续。

活动等待(非常)很少是一个好主意。你应该听一个事件。除此之外,它是否是易变的?我可以想象这不是一个好主意。我只是没有看到一个直接的其他解决方案。不,它不是易变的,还没有到那一部分(学习易变)。“在某些按钮被禁用之前不返回。这是我无法实现的,程序只是停止工作”,需要更具体地说明停止工作的意思,函数在其中某个地方崩溃,不返回,或者在按钮被禁用之前返回?不是swing程序员,所以我不确定这一点,但是如果playTurn()的话调用以响应事件,那么我认为在playTurn()返回之前swing无法处理任何其他事件。StackOverflow充满了惊喜…(例如,试图使用复制粘贴的代码的人谁知道在哪里找到的)。我的按钮将从已经存在的GUI更改。例如,按下按钮将使所有按钮都处于启用状态(false);我可能不得不采取艰难的方式然后重写很多。我必须补充一点,我希望它返回,但前提是所有按钮不再启用。您可能的解决方案即将实现。删除isEventDispatchThread时(它不工作,也冻结)但使用runnable,并在中添加一个JOptionPane,而我清楚地看到它在等待,因为JOptionPane不断弹出(我的gui也会绘制),但如果没有JOptionPane,任何东西都不会绘制,它会保持无响应。对此有什么解释吗?条件
如果(!SwingUtilities.isEventDispatchThread()){
当您不在
EDT
上时,应该返回
true
。这应该确保您的
GUI
不会冻结。我发现它对它的处理很奇怪。另外,我刚刚注意到,您在循环中检查了
!button1.isEnabled()
四次,是不是应该是
按钮1
按钮2
等等?