In pratica sto implementando il pattern MVC e ho la mia classe Main principale.
ho creato diverse scene in FXML ognuna con il proprio controller.
Nell classe Main all'interno del metodo start() ho impostato un ArrayList che può contenere oggetti di tipo Parent e all'interno di essa ho inserito tutte le scene di cui dispongo.
Ho implementato un metodo setScene(int numero_scena) che rimuove la scena visualizzata dal nodo radice e la sostituisce con quella nuova.
Il cambio di scena funziona ma dato che le mie scene hanno una dimensione diversa vorrei che si adattassero automaticamente alla nuova scena.
public class Main extends Application {
//creo una variabile statica di tipo AnchorPane in modo da appenderci altri layout(è un layout che consente di posizionare il contenuto a una distanza specifica dai lati)
private static AnchorPane anchor;
// la lista statica contiene tutte le pagine fxml in questo caso di tipo BorderPane
private static ArrayList<Parent> listascene = new ArrayList<>();
//Mi permette di tenere memoria della pagina inizialmente vale 0 che stò visualizzando in modo che,successivamente, io possa identificarla rimuoverla e sostituirla
private static int numeroscena;
@Override
public void start(Stage primaryStage) {
try {
Model model = new Model();
FXMLLoader loader = new FXMLLoader(getClass().getResource("anchor.fxml"));
FXMLLoader loaderMain = new FXMLLoader(getClass().getResource("main.fxml"));
FXMLLoader loaderDisposizione = new FXMLLoader(getClass().getResource("Disposizione.fxml"));
FXMLLoader loaderAlunni = new FXMLLoader(getClass().getResource("GestioneAlunno.fxml"));
FXMLLoader loaderRandom = new FXMLLoader(getClass().getResource("Random.fxml"));
anchor = (AnchorPane)loader.load();
BorderPane rootUno = (BorderPane)loaderMain.load();
BorderPane rootDue = (BorderPane)loaderDisposizione.load();
BorderPane rootTrei = (BorderPane)loaderAlunni.load();
BorderPane rootQuattro = (BorderPane)loaderRandom.load();
DisposizioneController controller = loaderDisposizione.getController();
controller.setModel(model);
//inserisco le mie scene nella lista
listascene.add(rootUno);
listascene.add(rootDue);
listascene.add(rootTrei);
listascene.add(rootQuattro);
//aggiungo al mio master layout la scena che voglio visualizzare la prima volta che eseguo il programma
anchor.getChildren().add(listascene.get(0));
Scene scene = new Scene(anchor);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setResizable(true);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* Questo metodo mi consente di settare la scena che voglio successivamente visualizzare
* all'interno di ogni controller della scena inserirò il numero del file FXML che voglio visualizzare
* 1)Rimuove la scena corrente (con il numeroscena attuale)
* 2)La sostituisce con il numeroscena che passo nel controller specifico
* 3)Tiene memoria dell'indice della scena che sto visualizzando in modo che alla successiva chiamata io possa rimuoverlo
* @param i <- indice del della lista che voglio visualizzare
*/
public static void setNumeroscena(int i) {
anchor.getChildren().remove(listascene.get(numeroscena));
anchor.getChildren().add(listascene.get(i));
numeroscena = i;
}