11

Stageをクリックして、内部からを閉じる方法が必要Buttonです。

メインクラスがあり、そこからシーンを使ってメインステージを作成します。そのためにFXMLを使用します。

public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("Builder.fxml"));
    stage.setTitle("Ring of Power - Builder");
    stage.setScene(new Scene(root));
    stage.setMinHeight(600.0);
    stage.setMinWidth(800.0);
    stage.setHeight(600);
    stage.setWidth(800);
    stage.centerOnScreen();
    stage.show();
}

表示されるメインウィンドウに、FXMLと適切なコントロールクラスを介して作成されたすべてのコントロールアイテムとメニューなどがあります。それは私がヘルプメニューにAbout情報を含めることに決めた部分です。そのため、[ヘルプ]-[バージョン情報]メニューがアクティブになると、次のようなイベントが発生します。

@FXML
private void menuHelpAbout(ActionEvent event) throws IOException{
    Parent root2 = FXMLLoader.load(getClass().getResource("AboutBox.fxml"));
    Stage aboutBox=new Stage();
    aboutBox.setScene(new Scene(root2));
    aboutBox.centerOnScreen();
    aboutBox.setTitle("About Box");
    aboutBox.setResizable(false);
    aboutBox.initModality(Modality.APPLICATION_MODAL); 
    aboutBox.show();
}

ご覧のとおり、About Boxウィンドウは、コントローラーを使用してFXMLを介して作成されます。Buttonコントローラ内から新しいステージを閉じるためにを追加したいと思います。

これができると思った唯一の方法は、パブリック静的ステージaboutBoxを定義することでした。Builder.javaクラス内で、終了ボタンのアクションイベントを処理するメソッド内のAboutBox.java内からそのクラスを参照します。しかし、どういうわけか、それは正確にきれいで正しいとは感じません。より良い方法はありますか?

4

2 に答える 2

27

イベントハンドラーに渡されたイベントから、閉じるステージを導出できます。

new EventHandler<ActionEvent>() {
  @Override public void handle(ActionEvent actionEvent) {
    // take some action
    ...
    // close the dialog.
    Node  source = (Node)  actionEvent.getSource(); 
    Stage stage  = (Stage) source.getScene().getWindow();
    stage.close();
  }
}
于 2012-07-13T18:23:55.550 に答える
1

JavaFX 2.1では、選択肢はほとんどありません。ジュエルシーの答えのように、またはあなたがすでに行ったことやそれの修正版のように

public class AboutBox extends Stage {

    public AboutBox() throws Exception {
        initModality(Modality.APPLICATION_MODAL);
        Button btn = new Button("Close");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent arg0) {
                close();
            }
        });

        // Load content via
        // EITHER

        Parent root = FXMLLoader.load(getClass().getResource("AboutPage.fxml"));
        setScene(new Scene(VBoxBuilder.create().children(root, btn).build()));

        // OR

        Scene aboutScene = new Scene(VBoxBuilder.create().children(new Text("About me"), btn).alignment(Pos.CENTER).padding(new Insets(10)).build());
        setScene(aboutScene);

        // If your about page is not so complex. no need FXML so its Controller class too.
    }
}

のような使用法で

new AboutBox().show();

メニュー項目アクションイベントハンドラー内。

于 2012-07-13T12:10:36.387 に答える