Applicazione di accesso con 1 stadio e scena multipla in JavaFX


Sto facendo un progetto timeline. Ho creato con successo un sistema di login e menu per tutto, ma quando premo i pulsanti che ho fatto, si aprirà una nuova finestra(con stage, scene). Ho letto che non è l'approccio migliore. Il modo migliore sarebbe avere solo 1 stadio primario, e quello sarebbe quando lancio l'applicazione, il login.

Ma ho cercato informazioni su più scene con uno stadio ma non ho trovato alcuna buona soluzione. Sarebbe davvero apprezzo davvero un po ' di aiuto ;) Spero che tu capisca cosa voglio ottenere. Vale la pena menzionare, i=Ho a che fare con i file Scenebuilder e fxml, quindi tutto quello che voglio fare è caricare un nuovo .scena fxml sul palco primario.

Quindi ho guardato in un altro thread e ho provato a fare un VistaFramework che gestisce tutte le modifiche alla scena. Ma non lo capisco completamente, e non riesco a farlo funzionare.

package application;

import javafx.fxml.FXMLLoader;

import java.io.IOException;

import controllers.MainController;

/**
 * Utility class for controlling navigation between vistas.
 *
 * All methods on the navigator are static to facilitate
 * simple access from anywhere in the application.
 */
public class VistaNavigator {

    /**
     * Convenience constants for fxml layouts managed by the navigator.
     */
    public static final String MAIN    = "LoginGUI.fxml";
    public static final String NEW_USER = "NewUserGUI.fxml";
    public static final String STARTMENU = "StartMenuGUI.fxml";

    /** The main application layout controller. */
    private static MainController mainController;

    /**
     * Stores the main controller for later use in navigation tasks.
     *
     * @param mainController the main application layout controller.
     */
    public static void setMainController(MainController mainController) {
        VistaNavigator.mainController = mainController;
    }

    /**
     * Loads the vista specified by the fxml file into the
     * vistaHolder pane of the main application layout.
     *
     * Previously loaded vista for the same fxml file are not cached.
     * The fxml is loaded anew and a new vista node hierarchy generated
     * every time this method is invoked.
     * @param fxml the fxml file to be loaded.
     */

    public static void loadVista(String fxml) {
        try {
            mainController.setVista(
                FXMLLoader.load(
                    VistaNavigator.class.getResource(
                        fxml
                    )
                )
            );
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Ottengo un errore in loadVista (). Ottieni il seguente errore a mainController.setVista ("Il metodo setVista (Nodo) nel tipo MainController non è applicabile per gli argomenti (Oggetto)"

Author: Howli, 2014-05-13

1 answers

Ogni file FXML non è necessariamente una nuova scena.

Un fxml è solo un file di visualizzazione con il suo root elementcome uno qualsiasi dei layout forniti da Javafx. Può avere più layout (come parte del layout principale) e controlli a seconda delle esigenze.

Per saperne di più su fxml, è possibile visualizzare

Per maggiori informazioni clicca qui. Quale è il modo migliore di programmare in JavaFX?

Tutorial su FXML

Http://docs.oracle.com/javafx/2/fxml_get_started/jfxpub-fxml_get_started.htm

Ora, una volta che il tuo FXML è pronto, puoi caricarlo in diversi modi:

  1. Carica come radice della tua scena
  2. Carica come parte del LAYOUT già caricato
  3. Carica come radice della nuova Scena e assegnala alla fase corrente

Per aiutarti a capire i punti precedenti ecco un esempio per ciascuno di essi. Qui, sto dimostrando un LoginController classe che è un controller per caricare il FXML.

Esempio - 1

FXMLLoader loader = new FXMLLoader(LoginController.class.getResource("root.fxml"));
AnchorPane login = (AnchorPane) loader.load();
Scene scene = new Scene(login); 

Esempio - 2

FXMLLoader loader = new FXMLLoader(LoginController.class.getResource("root.fxml"));
AnchorPane login = (AnchorPane) loader.load();
BorderPane borderPane = (BorderPane)scene.getRoot();
borderPane.setCenter(login);

Esempio - 3

FXMLLoader loader = new FXMLLoader(LoginController.class.getResource("root.fxml"));
AnchorPane login = (AnchorPane) loader.load();
Scene scene = new Scene(login);
stage.setScene(scene);//Stage loads the new scene, which has the layout of the fxml

N.B. Per maggiori dettagli su come accedere a Stage/Scene su diversi controller si prega di passare attraverso

Https://community.oracle.com/message/11251866

 9
Author: ItachiUchiha, 2017-05-23 10:29:29