web-dev-qa-db-ja.com

JavaFX:UI画面間を移動するためのベストプラクティス

UI画面をlogin.fxmlからhome.fxmlに変更したい。

StageまたはSceneを変更する必要がありますか?どちらがベストプラクティスかわかりません。また、コントローラーのハンドラーにラムダ式を使用できますか?

11
user4016255

まず、Stage .vsから始めましょう。 Scene問題:

既知のように、JavaFX階層は以下に基づいています:Stage-> Scene-> Nodes(など)。

こちらをご覧ください:

enter image description here

実際には、私の意見では、経験則は未来です。

  • プログラムのフローの別のplace(たとえば、ログイン->プロファイル)に進む予定がある場合は、Stageを変更します。

  • 同じ環境にいる場合(初めてログインする->複数の間違った試行の後にログインする)-Sceneを変更します。

ラムダの場合:Ahhmmm ...現在のJava/JavaFXバージョンにアビリティーがある場合-ありません使用しない理由。 Java 8のコントローラーハンドラーの詳細については、こちら すばらしいチュートリアル を参照してください)。

13
MordechayS

私は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つのボタンメニューを作成できます。

3
delusionX