Application de connexion avec 1 scène et plusieurs scènes dans JavaFX


Je fais un projet de chronologie. J'ai réussi à créer un système de connexion et des menus pour tout, mais lorsque j'appuie sur les boutons, je l'ai fait, il ouvrira une nouvelle fenêtre(avec scène, scènes). J'ai lu que ce n'est pas la meilleure approche. La meilleure façon serait de n'avoir qu'une seule étape principale, et celle-ci serait lorsque je lance l'application, la connexion.

Mais j'ai cherché des informations sur plusieurs scènes avec une scène mais je n'ai pas trouvé de bonnes solutions. Serait vraiment j'apprécie vraiment un peu d'aide;) J'espère que vous comprenez ce que je veux réaliser. Il convient de mentionner, i = Je traite des fichiers Scenebuilder et fxml, donc tout ce que je veux faire est de charger un nouveau .scène fxml sur la scène principale.

J'ai donc regardé dans un autre thread et j'essaie de faire un VistaFramework qui gère tous les changements de scène. Mais je ne comprends pas complètement, et je ne peux pas le faire fonctionner.

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();
        }
    }

}

J'obtiens une erreur dans loadVista(). Obtenez l'erreur suivante lors de mainController.setVista ("La méthode setVista (Node) dans le type MainController n'est pas applicable pour les arguments (Object)"

Author: Howli, 2014-05-13

1 answers

Chaque fichier FXML n'est pas nécessairement une nouvelle Scène.

Un fxml est juste un fichier de vue avec son root elementcomme l'une des mises en page fournies par Javafx. Il peut avoir plusieurs mises en page(dans le cadre de la mise en page racine) et des contrôles en fonction de vos besoins.

Pour en savoir plus sur fxml, vous pouvez voir

Vous avez besoin d'un script Java ou JavaFX. Quelle est la meilleure façon de programmer dans JavaFX?

Tutoriel sur la FXML

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

Maintenant, une fois votre FXML prêt, vous pouvez le charger de différentes manières:

  1. Charger en tant que racine de votre scène
  2. Charger dans le cadre de la DISPOSITION déjà chargée
  3. Charger en tant que racine de la nouvelle scène et l'affecter à la scène actuelle

Pour vous aider à comprendre les points ci-dessus, voici un exemple pour chacun d'eux. Ici, je suis de la démonstration d'un LoginController class qui est un contrôleur pour charger le FXML.

Exemple - 1

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

Exemple - 2

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

Exemple - 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. Pour plus de détails sur la façon d'accéder à Stage/Scene sur différents contrôleurs, veuillez passer par

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

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