web-dev-qa-db-ja.com

コード、ffxでfxmlウィンドウを閉じる

コントローラのコードで現在の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();
}

しかし、それは動作しません!

すべてのヘルプは大歓迎です。ありがとう!

45
alfredo138923
  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();
    }
    
132
Abdullah Battal

javafx.application.Application;を拡張するウィンドウがある場合は、次の方法を使用できます。 (これにより、ウィンドウだけでなく、アプリケーション全体が閉じられます。指摘してくれたコメンターのおかげで、私は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();
  }
}

Java 8の美しさを編集:

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

    Button exitButton = new Button("Exit");
    exitButton.setOnAction(actionEvent -> Platform.exit());
 }
18
codepleb

受け入れられた回答から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();
}
8
Austin D

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

@FXML
private Button cancelButton;

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

@FXML
private void close(Event event) {
    ((Node)(event.getSource())).getScene().getWindow().hide();                      
}
1
lolo

これが最良の方法であるか(または機能するか)わかりませんが、試してみることができます。

private void on_btnClose_clicked(ActionEvent actionEvent) {

        Window window = getScene().getWindow();   

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

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

1
Puce
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    public void handle(WindowEvent we) {                        
        Platform.setImplicitExit(false);
        stage.close();
    }
});

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

1
Om Prakash