Hey Leute, ich bin gerade am verzweifeln ...
Und zwar habe ich ein Problem mit der JavaFx Service Klasse.
Ich habe eine GUI mit einer Progress-Bar. Die GUI soll initialisiert werden und währenddessen soll die Progressbar durchlaufen.
Ich habe hier mal einen kleinen Code-Schnipsel, an dem ich das gerne testen würde:
Mein Problem an der Geschichte ist, dass ich in der createTask()-Methode nicht an meine GUI Elemente komme und dass ich dann außerhalb der Methode die ProgressBar nicht aktualisieren kann. Ich habe die Stellen im Code nochmal Kommentiert, welche ich meine.
Ich hoffe ihr könnt eine Lösung finden, dass ich gleichzeitig meine GUI Controlls initialisieren kann und dass der ProgressBar durchläuft.
Und zwar habe ich ein Problem mit der JavaFx Service Klasse.
Ich habe eine GUI mit einer Progress-Bar. Die GUI soll initialisiert werden und währenddessen soll die Progressbar durchlaufen.
Ich habe hier mal einen kleinen Code-Schnipsel, an dem ich das gerne testen würde:
Java:
package application.controller;
import java.net.URL;
import java.util.ResourceBundle;
import application.MainTestProj;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.scene.Cursor;
import javafx.scene.control.*;
import javafx.stage.Stage;
public class MainViewController extends SuperController {
@FXML private Button btn_startProg;
@FXML private Button btn_zuruecksetzen;
@FXML private TextField txt_delay;
@FXML private ProgressBar progBar;
@FXML private Label lbl1;
@FXML private Label lbl2;
@FXML private Label lbl3;
@FXML private TextField txt1;
@FXML private TextField txt2;
@FXML private TextField txt3;
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
}
@FXML
private void btn_startProg_afterClick() {
progBarSimu service = new progBarSimu();
service.setCursor(Cursor.WAIT);
service.initOwner(MainTestProj.getPrimaryStage());
service.setDelay(Long.parseLong(this.txt_delay.getText()));
service.setOnRunning(event -> {
});
service.setOnSucceeded(event -> {
try {
// Eigentlich Verarbeitung. Allerdings komm ich hier nicht an die Progressbar dran
lbl1.setText("Es");
Thread.sleep(1000);
txt1.setText("scheint");
Thread.sleep(1000);
txt2.setText("wohl");
Thread.sleep(1000);
txt3.setText("zu");
Thread.sleep(1000);
lbl2.setText("funktionieren");
Thread.sleep(1000);
lbl3.setText(":)");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Fertig");
});
progBar.progressProperty().bind(service.progressProperty());
service.start();
}
/*
*
* Service, der einfach nur den Cursor auf Wait setzt und die ProgressBar durchlaufen lässt
*/
private static class progBarSimu extends Service<Void> {
private Stage stage;
private Cursor cursor;
private Cursor lastCursor;
private long delay;
public void setDelay(long argDelay) {
this.delay = argDelay;
}
public void setCursor(Cursor argCursor) {
this.cursor = argCursor;
}
public void initOwner(Stage argStage) {
this.stage = argStage;
}
@Override
protected Task<Void> createTask() {
return new Task<Void> () {
@Override
protected Void call() throws Exception {
lastCursor = stage.getScene().getCursor();
stage.getScene().setCursor(cursor);
for (int i = 0; i <= 100; i++) {
try {
Thread.sleep(delay);
// Progressbar läuft durch, komme aber nicht an meine Controls, weil hier die eigentliche Verarbeitung stattfinden soll
updateProgress(i, 100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
};
}
}
@FXML
private void btn_zuruecksetzen_afterClick() {
this.progBar.setProgress(0.001);
}
@Override
public void setMainApp(MainTestProj mainApp) {
}
}
Mein Problem an der Geschichte ist, dass ich in der createTask()-Methode nicht an meine GUI Elemente komme und dass ich dann außerhalb der Methode die ProgressBar nicht aktualisieren kann. Ich habe die Stellen im Code nochmal Kommentiert, welche ich meine.
Ich hoffe ihr könnt eine Lösung finden, dass ich gleichzeitig meine GUI Controlls initialisieren kann und dass der ProgressBar durchläuft.