Я работаю над клиентом онлайн-покера Омахи, написанным в javaFX + java.
Мне нужно показать anchorPane, содержащую 3 кнопки после того, как control.call()
завершит выполнение. Я знаю, что control.call() завершает выполнение, но по какой-то причине task.setOnSucceeded(new EventHandler() {
метод task.setOnSucceeded(new EventHandler() {
handle не обновляет пользовательский интерфейс.
Что я делаю не так?
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();
}
Когда вы переопределяете метод call()
, вы можете переопределить метод succeeded()
: (См. Последний пример в javadoc задачи.)
@Override protected void succeeded() {
super.succeeded();
updateMessage("Done!");
}
succeeded()
уже вызван в приложении JavaFX Application Thread, поэтому вам не нужно делать это самостоятельно.
Вы уверены, что код в методе дескриптора не вызывается? Может быть, выбрано исключение NullPointerException, которое вы, возможно, не видите? Является ли сравнение работой, как ожидалось?
Попробуйте переместить код, if (client.getAction()...
в переопределенном succeeded()
метод и поставить Println перед Условным оператором для того, чтобы увидеть это называется или нет.
(EDIT: опечатки)
exceptionProperty
которое вы можете посмотреть в методе failed()
.
Проблема в том, что вы обновляете пользовательский интерфейс в другом потоке. Если вы находитесь в другом потоке и хотите обновить интерфейс пользователя
Вам нужно позвонить
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();
}
Ваша информация была полезной, но я думаю, что все предложенные методы сработали бы (включая мою начальную). Проблема в том, что задача никогда не заканчивалась тем, что onTaskSucceded никогда не выполнялся. Чтобы завершить задачу после завершения, я должен был установить демона в true:
Thread thread = new Thread(task);
thread.setDaemon(true);
thread.start();
setDaemon(true)
" код был выполнен после вставки вызова setDaemon(true)
?
call(...)
выполняется успешно, а не вызывает исключение? Попробуйте зарегистрироватьsetOnFailed(...)
с помощьюtask.getException().printStackTrace()
чтобы увидеть, если что-то выбрасывается.