Объяснение
В первом сценарии , когда вы используете
Task task = new Task<Void>() {
@Override
protected Void call() throws Exception {
initStubGamepad();
return null;
}
}
Внутри initStubGamepad()
, который запущен на задаче, вы пытаются обновить компоненты пользовательского интерфейса внутри методов pressBtn()
и releaseBtn()
, поэтому вы сталкиваетесь с
java.lang.IllegalStateException: Not on FX application thread
, поскольку все обновления пользовательского интерфейса должны встречаться в потоке JavaFX
В втором сценарии , когда вы используете
Platform.runLater(new Runnable() {
@Override
public void run() {
initStubGamepad();
}
});
, пользовательский интерфейс не появляется, потому что у вас бесконечный цикл внутри initStubGamepad()
, который помещает поток приложений JavaFX в бесконечный цикл
Решение
. К тому времени, как вы сюда доберетесь, вы должны уже найти решение. Если вы этого не сделали, попробуйте поместить обновление компонентов Javafx в поток пользовательского интерфейса. Таким образом, вместо вызова initStubGamepad()
внутри Platform.runLater
попробуйте вызвать внутри него pressBtn()
и releaseBtn()
.
Попробуйте использовать
while (true) {
if (rnd.nextInt(30) == 3) {
Platform.runLater(() -> pressBtn());
} else if (rnd.nextInt(30) == 7) {
Platform.runLater(() -> releaseBtn());
}
}
или вы также можете использовать
public void pressBtn() {
if(!isXPressed) {
Platform.runLater(() -> iv1.setVisible(true));
isXPressed = true;
}
}
Как уже упоминалось в комментарии Джерри, вы получите краткий учебник о том, как создавать гистограмму с накоплением. Например, , этот .
Поскольку ваши данные очень малы, я продемонстрирую, как это сделать быстро и просто:
Во-вторых, вам нужно выбрать диапазон ячеек A1
- C9
и выбрать столбчатую диаграмму с накоплением под диаграммами (также показано в ссылке выше).
Это создаст вашу гистограмму с накоплением
338
, см. скриншот ниже (на голландском, но вы поймете):