Ich habe ein JavaFX-Programm, das eine Aufgabe von einer separaten Klasse gestartet. Ich möchte den Status des Fortschritts dieser Aufgabe an ein Element Label
in der Benutzeroberfläche ausgeben. Ich kann das nicht zur Arbeit bringen. Hier ist mein Code:JavaFX: Update UI in separaten, nicht-Controller-Klasse
Main.java:
public class Main extends Application {
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("ui.fxml"));
primaryStage.setTitle("Data collector");
primaryStage.setScene(new Scene(root, 400, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Controller.java:
Das Label I aktualisieren wollen, erstellt von global @FXML public Label label = new Label();
delcaring. Erstellt einen neuen Thread über new Thread(new Task<Void>() { ... }).start();
, um die collect_data
-Methode von TaskRun
auszuführen. Die TaskRun
Klasse ist unten angegeben:
TaskRun.java:
class TaskRun {
private Controller ui;
TaskRun() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("ui.fxml"));
ui = loader.getController();
}
void collect_data() {
for (int i = 0; i < 100; i++) {
// do stuff...
send_progress_to_ui(((float) i/(float)) * 100);
}
}
void send_progress_to_ui(float percent) {
new Thread(new Task<Void>() {
@Override
protected Void call() throws Exception {
Platform.runLater(() -> ui.label.setText(Float.toString(percent_complete) + "%"));
return null;
}
}).start();
}
}
ich eine NullPointerException
auf der Linie mit dem Platform.runLater(...)
bekommen.
So offensichtlich wird diese Methode nicht funktionieren. Wie aktualisiere ich die Benutzeroberfläche über diese Nicht-Controller-Klasse TaskRun
?
Wenn der Controller eine Instanz von Taskrun startet, können Sie Folgendes tun: new TaskRun (this) und in TaskRun's Konstruktor: TaskRun (Controller control) {ui = contro;) vielleicht versuchen, wie dies;), aber es hängt davon ab, wo Taskrun erstellt wird – azro
Es ist in einem Thread innerhalb des Controllers erstellt. Vielleicht ist das das Problem? – jshapy8
nicht sicher, aber sicherlich werde ich nicht arbeiten, wie du es getan hast, weil du 2 Instanzen von Controller hinzufügen wirst, es muss das gleiche sein, versuche, was ich schrieb und erzähle uns – azro