我正在开发一个用 javaFX+java 编写的奥马哈在线扑克客户端。
我需要在 control.call()
执行完成后显示一个包含 3 个按钮的anchorPane。 我知道 control.call() 已完成执行,但由于某种原因 task.setOnSucceeded(new EventHandler() {
) 的处理方法不会更新用户界面。
我做错了什么?
public void newRound() {
sog = StateOfGame.PREFLOP;
ControlGameOnNewThread control = new ControlGameOnNewThread();
Task task = new Task() {
@Override
protected Object call() throws Exception {
control.call();
return null;
}
};
task.setOnSucceeded(new EventHandler() {
@Override
public void handle(Event event) {
if (client.getAction() == FirstToAct.me) {
System.out.println("Task finsished");
showOptions(client.getToCall());
opponentBetField.setText(new Integer(opp.chipsInvested).toString());
myBetField.setText(new Integer(client.chipsInvested).toString());
System.out.println("Task finsished");
}
}
});
new Thread(task).start();
}
最佳答案
问题是您正在另一个线程中更新用户界面..如果您在另一个线程中并且想要更新用户界面
您需要调用
<小时/>Platform.runLater(new Runnable() {
@Override public void run() {
//Update UI here
}
});
调用此函数将调用主线程并将所有必要的更新更新到用户界面
编辑
public void newRound() {
sog = StateOfGame.PREFLOP;
ControlGameOnNewThread control = new ControlGameOnNewThread();
Task task = new Task() {
@Override
protected Object call() throws Exception {
control.call();
return null;
}
};
task.setOnSucceeded(new EventHandler() {
@Override
public void handle(Event event) {
if (client.getAction() == FirstToAct.me) {
Platform.runLater(new Runnable() {
@Override public void run() {
System.out.println("Task finsished");
showOptions(client.getToCall());
opponentBetField.setText(new Integer(opp.chipsInvested).toString());
myBetField.setText(new Integer(client.chipsInvested).toString());
System.out.println("Task finsished");
}
});
}
}
});
new Thread(task).start();
}
关于JavaFX:任务不会更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23209245/