[英]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.