MultiVieux JavaFX

di il
5 risposte

MultiVieux JavaFX

Salve scusatemi per la domanda stupida ma sono alle prime armi con java e la libreria javaFx.
Qualcuno saprebbe consigliarmi qualche testo per documentarmi bene su questa libreria?
Non riesco a realizzare una app che utilizzi una schermata multipla e che adatti la sua dimensione alla scena che sta visualizzando.
Grazie

5 Risposte

  • Re: MultiVieux JavaFX

    SUX600 ha scritto:


    Qualcuno saprebbe consigliarmi qualche testo per documentarmi bene su questa libreria?
    Innanzitutto c'è della documentazione ufficiale e gratuita di Oracle: https://docs.oracle.com/javase/8/javase-clienttechnologies.htm

    Se invece vuoi proprio libri acquistabili, ce ne sono svariati e a più livelli (introduttivi ... avanzati). Basta vedere es.:
    https://www.apress.com/it/search?query=javaf
    https://search.packtpub.com/?query=javaf
    https://www.mhprofessional.com/catalogsearch/result/?q=javafx

    SUX600 ha scritto:


    Non riesco a realizzare una app che utilizzi una schermata multipla e che adatti la sua dimensione alla scena che sta visualizzando.
    Puoi chiarire meglio? Non sono super-ferrato di JavaFX ma se spieghi, posso valutare/verificare qualcosa.
  • Re: MultiVieux JavaFX

    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;	
    	}
    
    
    
    
  • Re: MultiVieux JavaFX

    SUX600 ha scritto:


    Il cambio di scena funziona ma dato che le mie scene hanno una dimensione diversa vorrei che si adattassero automaticamente alla nuova scena.
    Non posso ovviamente provare quel tuo codice ma .. vuoi che lo stage (la finestra) si ridimensioni con la nuova scena? O che altro?


    P.S. togli gli static dai campi e da quell'ultimo metodo.
  • Re: MultiVieux JavaFX

    Sì vorrei appunto che lo stage si ridimensioni con la nuova scena.

    li ho dichiarati statici per non istanziare oggetti poi nei controller, richiamo il metodo setNumeroscena(int i) direttamente dalla classe Main
  • Re: MultiVieux JavaFX

    SUX600 ha scritto:


    Sì vorrei appunto che lo stage si ridimensioni con la nuova scena.
    Se non sbaglio, ma vado a memoria (verifica meglio tu) lo Stage ha un metodo tipo sizeToScene().

    SUX600 ha scritto:


    li ho dichiarati statici per non istanziare oggetti poi nei controller, richiamo il metodo setNumeroscena(int i) direttamente dalla classe Main
    Si può fare sicuramente diversamente e meglio. È una questione di "design delle classi" che presumo devi ancora affrontare bene.
Devi accedere o registrarti per scrivere nel forum
5 risposte