Открытие новой сцены в потоке Javafx
есть код который запускает другой код и отображает в progressbar уровень выполнения этих кодов.
это происходит в void initialize(){...}
void initialize() throws IOException {
new Thread(() -> {
try {
map_8_8.SetZero();
} catch (IOException e) {
e.printStackTrace();
}
Platform.runLater(() -> bar.setProgress( bar.getProgress() + 0.33 ));
try {
map_8_8.Bomb();
} catch (IOException e) {
e.printStackTrace();
}
Platform.runLater(() -> bar.setProgress( bar.getProgress() + 0.33 ));
try {
map_8_8.GetBoxValue();
} catch (IOException e) {
e.printStackTrace();
}
Platform.runLater(() -> bar.setProgress(1));
}).start();
и после заполнения Progressbar должа быть заргузка другой сцены, можно подставить её например в последний пункт:
@FXML
void initialize() throws IOException {
new Thread(() -> {
try {
map_8_8.SetZero();
} catch (IOException e) {
e.printStackTrace();
}
Platform.runLater(() -> bar.setProgress( bar.getProgress() + 0.33 ));
try {
map_8_8.Bomb();
} catch (IOException e) {
e.printStackTrace();
}
Platform.runLater(() -> bar.setProgress( bar.getProgress() + 0.33 ));
try {
map_8_8.GetBoxValue(); // запуск кода после выполнения последнего которого я запускаю другую сцену
try {
Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("8X8.fxml")));
Stage window = (Stage) bar.getScene().getWindow();
window.setScene(new Scene(root, 600, 400));
} catch (Exception e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
Platform.runLater(() -> bar.setProgress(1));
}).start();
}
но вылетает ошибка:
java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3
at javafx.graphics/com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:292)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:446)
at javafx.graphics/javafx.stage.Stage.setScene(Stage.java:265)
at com.example.javasapp/com.example.javasapp.load_8_8.lambda$initialize$3(load_8_8.java:48)
at java.base/java.lang.Thread.run(Thread.java:831)
как можно это исправить или добиться желаемого результата без этой ошибки?
Ответы (1 шт):
Автор решения: Perfect Voyage
→ Ссылка
Полная версия тут https://github.com/Platence/TaskProgressBar/tree/main/src/sample Пример с использованием класса Task
public class ProcessingBar extends Task<Void> {
private ProgressBar progressBar;
private static final double MAX_VALUE = 1.0D;
public ProcessingBar(ProgressBar progressBar) {
this.progressBar = progressBar;
}
@Override
protected Void call() throws Exception {
// Есть ещё вариант с методом bind
// Например
// progressBar.progressProperty().bind(this.progressProperty());
double startValue = 0D;
System.out.println("start");
while (startValue<MAX_VALUE){
Thread.sleep(1000);
setValue(startValue+=0.1D);
System.out.println("Change Bar");
}
return null;
}
private void setValue(double value){
Platform.runLater(()->{this.progressBar.setProgress(value);});
}
}
Код из контроллера
public class Controller {
@FXML
private AnchorPane mainPane;
public void initialize() {
ProgressBar pb = new ProgressBar();
pb.setLayoutY(10);
pb.setLayoutX(10);
ProgressBar pb2 = new ProgressBar();
pb2.setLayoutY(30);
pb2.setLayoutX(30);
Platform.runLater(() ->
{
mainPane.getChildren().add(pb);
mainPane.getChildren().add(pb2);
}
);
Thread t1 = new Thread(new ProcessingBar(pb));
Thread t2 = new Thread(new ProcessingBar(pb2));
t1.setDaemon(true);t2.setDaemon(true);
t1.start();
t2.start();
}
}