私はタイムラインプロジェクトを行っています。ログインシステムとすべてのメニューを正常に作成しましたが、ボタンを押すと、新しいウィンドウ(ステージ、シーンを含む)が開きます。私はそれが最善のアプローチではないことを読みました。最善の方法は、プライマリステージを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)は引数(オブジェクト)に適用できません"で次のエラーが発生します。
各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の準備ができたら、さまざまな方法でロードできます。
上記の点を理解しやすくするために、それぞれの例を示します。ここでは、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
にアクセスする方法の詳細については、以下を参照してください。