web-dev-qa-db-ja.com

JavaFXで1つのステージと複数のシーンを持つログインアプリケーション

私はタイムラインプロジェクトを行っています。ログインシステムとすべてのメニューを正常に作成しましたが、ボタンを押すと、新しいウィンドウ(ステージ、シーンを含む)が開きます。私はそれが最善のアプローチではないことを読みました。最善の方法は、プライマリステージを1つだけにすることです。それは、アプリケーションを起動したときのログインです。

しかし、私は1つのステージで複数のシーンに関する情報を探しましたが、良い解決策は見つかりませんでした。本当に助けていただければ幸いです;)私が達成したいことを理解していただければ幸いです。言及する価値があるのは、i = Scenebuilderファイルとfxmlファイルを扱っているので、基本的にやりたいのは、新しい.fxmlシーンをプライマリステージにロードすることだけです。

そこで、別のスレッドを調べて、すべてのシーンの変更を処理するVistaFrameworkを実行しようとしました。しかし、私はそれを完全には理解しておらず、それを機能させることができません。

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

}

LoadVista()でエラーが発生します。 mainController.setVista( "タイプMainControllerのメソッドsetVista(Node)は引数(オブジェクト)に適用できません"で次のエラーが発生します。

6
jabbeboy

各FXMLファイルは必ずしも新しいシーンではありません。

Fxmlは、Javafxによって提供される Layouts のいずれかと同じようにroot elementを持つ単なるビューファイルです。要件に応じて、複数のレイアウト(ルートレイアウトの一部として)とコントロールが含まれる場合があります。

Fxmlの詳細については、

Java vs JavaFXスクリプトvsFXML。JavaFXでのプログラミングのより良い方法はどれですか?

FXMLのチュートリアル

http://docs.Oracle.com/javafx/2/fxml_get_started/jfxpub-fxml_get_started.htm

これで、FXMLの準備ができたら、さまざまな方法でロードできます。

  1. シーンのルートとしてロード
  2. すでにロードされているレイアウトの一部としてロードします
  3. 新しいシーンのルートとしてロードし、現在のステージに割り当てます

上記の点を理解しやすくするために、それぞれの例を示します。ここでは、LoginControllerをロードするためのコントローラーであるFXMLクラスを示しています。

例-1

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

例-2

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

例-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。さまざまなコントローラーでStage/Sceneにアクセスする方法の詳細については、以下を参照してください。

https://community.Oracle.com/message/11251866

10
ItachiUchiha