繁体   English   中英

实施此操作的正确方法是什么?

[英]What is the correct way to implement this do while?

我这样启动我的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无响应,因为更改GUI的代码通常必须在EDT上运行。不会从您的GUI更改,一旦循环开始,它可能永远循环下去。

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

从注释中进行编辑:由于您不希望playTurn返回,因此请勿在其中使用线程,并确保playTurn不在EDT上运行。 创建并让新Thread运行代码后,您的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);
  }
}

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

这个想法是在不希望/不需要它的地方调用新Thread ,以等待在新Thread运行的代码结束以继续。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM