我这样启动我的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
中运行的代码结束以继续。