65

コントローラのコードで現在のfxmlウィンドウを閉じる必要があります

私はstage.close()またはstage.hide()がfxでこれを行うことを知っています

これをfxmlに実装する方法は?私は試した

private void on_btnClose_clicked(ActionEvent actionEvent) {
        Parent root = FXMLLoader.load(getClass().getResource("currentWindow.fxml"));    
        Scene scene = new Scene(root);

        Stage stage = new Stage();            
        stage.setScene(scene);
        stage.show();
}

しかし、それは機能しません!

すべての助けは大歓迎です。ありがとう!

4

9 に答える 9

176
  1. まだ行っていない場合は、閉じるボタンにfx:idを指定します。<Button fx:id="closeButton" onAction="#closeButtonAction">
  2. コントローラクラスの場合:

    @FXML private javafx.scene.control.Button closeButton;
    
    @FXML
    private void closeButtonAction(){
        // get a handle to the stage
        Stage stage = (Stage) closeButton.getScene().getWindow();
        // do what you have to do
        stage.close();
    }
    
于 2012-11-28T09:55:25.153 に答える
24

拡張するウィンドウがある場合はjavafx.application.Application;、次の方法を使用できます。(これにより、ウィンドウだけでなく、アプリケーション全体が閉じます。OPを指摘してくれたコメント投稿者のおかげで、OPを誤って解釈しました)。

Platform.exit();

例:

public class MainGUI extends Application {
.........

Button exitButton = new Button("Exit");
exitButton.setOnAction(new ExitButtonListener());
.........

public class ExitButtonListener implements EventHandler<ActionEvent> {

  @Override
  public void handle(ActionEvent arg0) {
    Platform.exit();
  }
}

Java8の美しさのために編集:

 public class MainGUI extends Application {
    .........

    Button exitButton = new Button("Exit");
    exitButton.setOnAction(actionEvent -> Platform.exit());
 }
于 2013-08-21T16:15:35.033 に答える
12

NullPointerException受け入れられた回答からを受け取った後、私はこれを次のように実装しました。

私のFXMLでは:

<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel">

私のControllerクラスでは:

@FXML public void onMouseClickedCancelBtn(InputEvent e) {
    final Node source = (Node) e.getSource();
    final Stage stage = (Stage) source.getScene().getWindow();
    stage.close();
}
于 2016-02-11T05:18:13.610 に答える
2

fxmlにリンクされたメソッドを使用してコントローラーを広めたくない場合は、次のようにすることができます。

fx:idを指定する必要があります。たとえば、「closeButton」。FXMLファイルでは次のようになります。

<Button fx:id="closeButton" layoutX="876.0" layoutY="74.0" mnemonicParsing="false" textAlignment="CENTER">

次に、initializeメソッドまたは任意の場所でボタンをコーディングできます。

@FXML
Button closeButton

public initialize(){
    closeButton.setOnAction(new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent e){
            ((Stage) closeButton.getScence().getWindow()).close();
        }
    });
}
于 2021-12-14T10:29:50.207 に答える
1

これが最善の方法であるかどうか(またはそれが機能するかどうか)はわかりませんが、次のことを試すことができます。

private void on_btnClose_clicked(ActionEvent actionEvent) {

        Window window = getScene().getWindow();   

        if (window instanceof Stage){
            ((Stage) window).close();
        }
}

(コントローラーがノードであると仮定します。それ以外の場合は、最初にノードを取得する必要があります(getScene()はNodeのメソッドです)

于 2012-11-27T17:56:51.243 に答える
1
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    public void handle(WindowEvent we) {                        
        Platform.setImplicitExit(false);
        stage.close();
    }
});

と同等hideです。したがって、次回開くときは、stageオブジェクトが終了しているかどうかを確認するだけです。それが終了した場合、あなたはただshow()呼び出すだけ(stage.show())です。それ以外の場合は、ステージを開始する必要があります。

于 2015-07-09T06:15:05.480 に答える
1

イベントをトリガーする必要のない優れたソリューションを見つけました。

@FXML
private Button cancelButton;

close(new Event(cancelButton, stage, null));

@FXML
private void close(Event event) {
    ((Node)(event.getSource())).getScene().getWindow().hide();                      
}
于 2016-04-25T08:57:57.943 に答える
1

最後に、私は解決策を見つけました

 Window window =   ((Node)(event.getSource())).getScene().getWindow(); 
            if (window instanceof Stage){
                ((Stage) window).close();
            }
于 2019-11-25T13:29:48.097 に答える
1

Hideはウィンドウを閉じず、表示モードにするだけです。最善の解決策は次のとおりです。

@FXML
private void exitButtonOnAction(ActionEvent event){
        ((Stage)(((Button)event.getSource()).getScene().getWindow())).close();      
}
于 2020-05-03T13:44:12.130 に答える