UI画面をlogin.fxml
からhome.fxml
に変更したい。
Stage
またはScene
を変更する必要がありますか?どちらがベストプラクティスかわかりません。また、コントローラーのハンドラーにラムダ式を使用できますか?
まず、Stage
.vsから始めましょう。 Scene
問題:
既知のように、JavaFX
階層は以下に基づいています:Stage
-> Scene
-> Nodes
(など)。
こちらをご覧ください:
実際には、私の意見では、経験則は未来です。
プログラムのフローの別のplace(たとえば、ログイン->プロファイル)に進む予定がある場合は、Stage
を変更します。
同じ環境にいる場合(初めてログインする->複数の間違った試行の後にログインする)-Scene
を変更します。
ラムダの場合:Ahhmmm ...現在のJava
/JavaFX
バージョンにアビリティーがある場合-ありません使用しない理由。 Java 8のコントローラーハンドラーの詳細については、こちら すばらしいチュートリアル を参照してください)。
私はJavaFX
のシーンを変更するためにこのアプローチを使用しています:
/**
* Controller class for menuFrame.fxml
*/
public class MenuFrameControl implements Initializable {
@FXML private Button sceneButton1;
@FXML private Button sceneButton2;
@FXML private Button sceneButton3;
/**
* Event handling method, loads new scene from .fxml file
* according to clicked button and initialize all components.
* @param event
* @throws IOException
*/
@FXML
private void handleMenuButtonAction (ActionEvent event) throws IOException {
Stage stage = null;
Parent myNewScene = null;
if (event.getSource() == sceneButton1){
stage = (Stage) sceneButton1.getScene().getWindow();
myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene1.fxml"));
} else if (event.getSource() == sceneButton2){
stage = (Stage) flightBtn.getScene().getWindow();
myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene2.fxml"));
} else if (event.getSource() == sceneButton3) {
stage=(Stage) staffBtn.getScene().getWindow();
myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene3.fxml"));
}
Scene scene = new Scene(myNewScene);
stage.setScene(scene);
stage.setTitle("My New Scene");
stage.show();
}
@Override
public void initialize(URL location, ResourceBundle resources) { }
基本的にボタンをクリックすると、実際に表示されているStage
オブジェクトがstage
変数に保存されます。次に、新しいScene
オブジェクトを.fxmlファイルからmyNewScene
変数に読み込み、この新しく読み込まれたScene
オブジェクトを保存したStage
オブジェクトに入れます。
このコードを使用すると、単一のStage
オブジェクトを使用して、各ボタンが異なるシーンに切り替わる基本的な3つのボタンメニューを作成できます。