Hallo Männers,
ich beschäftige mich noch nicht so lange mit JavaFX und ich bin da jetzt wieder über eine Sache gestolpert, wo ich mal Hilfe brauche.
Ich möchte eine ProgressBar Laden lassen, wenn ich es mit einem Button starte, dann klappt es, wenn ich es aber in der "initialize-Methode" starten will, klappt es nicht.
Das verstehe ich nicht.
Stage
FXML
Controller
ich beschäftige mich noch nicht so lange mit JavaFX und ich bin da jetzt wieder über eine Sache gestolpert, wo ich mal Hilfe brauche.
Ich möchte eine ProgressBar Laden lassen, wenn ich es mit einem Button starte, dann klappt es, wenn ich es aber in der "initialize-Methode" starten will, klappt es nicht.
Das verstehe ich nicht.
Stage
Java:
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
Parent root = FXMLLoader.load(getClass().getResource("MeinFXML.fxml"));
Scene scene = new Scene(root);
primaryStage.setTitle("mein Feinster");
primaryStage.setScene(scene);
primaryStage.show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
FXML
Java:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="316.0" prefWidth="362.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">
<children>
<VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">
<children>
<ProgressBar fx:id="meineProzessBar" prefWidth="200.0" progress="0.0" />
<Label fx:id="label" text="Label" />
<Button fx:id="startButton" mnemonicParsing="false" onAction="#actionStart" text="Start">
<font>
<Font size="20.0" />
</font>
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Button>
</children>
</VBox>
</children>
</AnchorPane>
Controller
Java:
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
public class Controller {
private Task copyWorker;
@FXML private Button startButton;
@FXML private ProgressBar meineProzessBar;
@FXML private Label label;
@FXML void actionStart(ActionEvent event) {
copyWorker = createWorker();
meineProzessBar.progressProperty().unbind();
meineProzessBar.progressProperty().bind(copyWorker.progressProperty());
label.textProperty().bind(copyWorker.messageProperty());
new Thread(copyWorker).start();
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public void initialize(URL location, ResourceBundle resources) {
Platform.runLater(() -> {
copyWorker = createWorker();
meineProzessBar.progressProperty().unbind();
meineProzessBar.progressProperty().bind(copyWorker.progressProperty());
label.textProperty().bind(copyWorker.messageProperty());
new Thread(copyWorker).start();
});
}
public Task createWorker() {
return new Task() {
@Override
protected Object call() throws Exception {
for (int i = 0; i < 10; i++) {
Thread.sleep(2000);
updateMessage(i + "");
updateProgress(i + 1, 10);
System.out.println(meineProzessBar.getProgress());
}
return true;
}
};
}
}