コントローラのコードで現在の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();
}
しかし、それは動作しません!
すべてのヘルプは大歓迎です。ありがとう!
<Button fx:id="closeButton" onAction="#closeButtonAction">
コントローラークラスで:
@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();
}
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());
}
受け入れられた回答から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();
}
イベントをトリガーする必要のない素敵なソリューションを見つけました。
@FXML
private Button cancelButton;
close(new Event(cancelButton, stage, null));
@FXML
private void close(Event event) {
((Node)(event.getSource())).getScene().getWindow().hide();
}
これが最良の方法であるか(または機能するか)わかりませんが、試してみることができます。
private void on_btnClose_clicked(ActionEvent actionEvent) {
Window window = getScene().getWindow();
if (window instanceof Stage){
((Stage) window).close();
}
}
(コントローラーがノードであると仮定します。そうでなければ、最初にノードを取得する必要があります(getScene()はNodeのメソッドです)
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent we) {
Platform.setImplicitExit(false);
stage.close();
}
});
hide
と同等です。そのため、次回開くときに、stage
オブジェクトが終了しているかどうかを確認するだけです。終了する場合は、show()
つまり(stage.show())
を呼び出すだけです。それ以外の場合は、ステージを開始する必要があります。