Intercettare l'evento di resize nel controller in JavaFX
Se cercate come intercettare l'evento di resizing della finestra in JavaFX, otterrete una serie di esempi (più o meno simili) funzionanti solo nei casi più basici.
Quindi non dove usiamo file FXML associati ad un controller.
Questo perchè, tali esempi, non considerano il fatto che il codice viene lanciato nel controller e non nel main.
Ad esempio questo codice non funziona:
public class MainController {
private Stage stage;
@FXML
private BorderPane mainPane;
@FXML
public void initialize() {
getStage().widthProperty().addListener((obs, oldVal, newVal) -> {
});
}
private Stage getStage() {
stage = (Stage) mainPane.getScene().getWindow();
return stage;
}
}
Questo perchè nel metodo initialize, lo Stage ancora non esiste; il programma andrà inevitabilmente in eccezione.
Tra le tonnellate di pagine consultate, sono riuscito a trovare del codice funzionante su Stack Overflow (ovviamente non ritrovo più la pagina).
Comunque questo funziona:
public class MainController {
private Stage stage;
@FXML
private BorderPane mainPane;
@FXML
public void initialize() {
mainPane.sceneProperty().addListener(
(observableScene, oldScene, newScene) -> {
if (oldScene == null && newScene != null) {
newScene.windowProperty().addListener(
(observableWindow, oldWindow, newWindow) -> {
if (oldWindow == null && newWindow != null) {
getStage().heightProperty().addListener(
(observable, oldValue, newValue) -> {
// DO STUFF
});
}
});
}
});
}
private Stage getStage() {
stage = (Stage) mainPane.getScene().getWindow();
return stage;
}
}
In pratica, viene aggiunto un controllo sulla effettiva esistenza della finestra e del relativo Stage.
Una volta fatto questo, potete aggiungere tutti gli eventi che volete ovviamente.
Enjoy!
java javafx fxml stage scene initialize
Commentami!