Im folgenden Beispiel gibt es einen FXML-Controller, der einen separaten Thread ausführt, um Komponenten regelmäßig zu aktualisieren.JavaFX verwaltet Abfragestrukturen, die an den Szenenlebenszyklus gebunden sind
Wenn der Benutzer klickt, um von diesem Controller zu navigieren und zu diesem Controller zurückkehrt, werden 2 Threads im Hintergrund ausgeführt. (Der erste hat nie aufgehört).
Wie kann ich sicherstellen, dass es immer nur 1 Thread gibt und dass dieser Thread an die Lebensdauer des Controllers gebunden ist?
<BorderPane xmlns:fx="http://javafx.com/fxml/1"
fx:controller="example.BorderController"
fx:id="rootPane">
<left>
<VBox>
<Button text="Pane1" onAction"#goToPane1"/>
<Button text=Pane2" onAction="goToPane2"/>
</VBox>
</left>
</BorderPane>
.
public class BorderController implements Initializable {
@FXML private BorderPane rootPane;
@FXML
public void goToPane1(ActionEvent event) {
showPage("fxml/Pane1");
}
@FXML
public void goToPane2(ActionEvent event) {
showPage("fxml/Pane2");
}
private void showPage(final Stringpage) {
try {
rootPane.setCenter((Node) FXMLLoader.load(getClass().getResource(page)));
} catch (final IOException ex) {
LOGGER.log(Level.INFO, "An error occurred loading the page.", ex);
}
}
}
.
public class Pane1Controller implements Initializable {
@FXML private Label toUpdate;
@Override
public void initialize(URL url, ResourceBundle rb) {
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() -> {
Platform.runLater(() -> {
System.out.println("Pane1 " + this);
toUpdate.setText(Instant.now().toString());
});
}, 2, 2, SECONDS);
}
}
der Ausgang zwischen den 2 Scheiben nach dem Navigieren ist wie folgt:
Pane1 [email protected]
Pane1 [email protected]
Pane1 [email protected]
Pane1 [email protected]
// Repeats