0

この例を使用して、アプリケーションのモーダル ダイアログを作成しています。ダイアログの終了ボタン(右上隅の赤いボタン)をクリックすると、すべて正常に動作します。ダイアログが閉じて、通常どおり開くことができます。しかしButton、ダイアログを閉じる を追加しようとすると、再度開くまですべて正常に動作します。その後、スローされますIllegalStateException(必要に応じて、この例外で回答を更新します)。

これは、ダイアログを閉じる方法を示すイベント ハンドラーです。

    btnClose.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            dialog.close();
        }
    });

アプリケーションのモーダル ダイアログを適切に閉じる方法を教えてもらえますか? 前もって感謝します。

4

2 に答える 2

3

編集

問題が見つかったようです。他の誰かが同様の問題を抱えている場合に備えて、サンプル コードで私の回答を保持していると思います。


あなたの btnClose アクションは私にとってはうまくいくので、投稿していないコードに問題がある可能性があります。

これをテストするために作成したサンプルを次に示します。

import javafx.application.Application;
import javafx.event.*;
import javafx.geometry.Pos;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.*;

public class DialogClosing extends Application {
    @Override public void start(final Stage stage) {
        final Button showDialog = new Button("Show Dialog");
        showDialog.setOnAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent actionEvent) {
                showDialog(stage, showDialog);
            }
        });

        StackPane layout = new StackPane();
        layout.getChildren().setAll(
            showDialog
        );

        layout.setStyle("-fx-padding: 10px;");
        stage.setScene(
            new Scene(
                layout
            )
        );
        stage.show();
    }

    private Stage showDialog(Window parent, final Node showControlNode) {
        showControlNode.setDisable(true);

        final Stage dialog = new Stage();
        dialog.initOwner(parent);
        dialog.initStyle(StageStyle.UTILITY);
        dialog.setX(parent.getX());
        dialog.setY(parent.getY() + parent.getHeight());

        Button closeDialog = new Button("Close Dialog");
        closeDialog.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                dialog.close();
            }
        });
        dialog.setOnHidden(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent windowEvent) {
                showControlNode.setDisable(false);
            }
        });

        VBox layout = new VBox(10);
        layout.setAlignment(Pos.CENTER);
        layout.getChildren().addAll(
            new Label("Hello World!"),
            closeDialog
        );
        layout.setStyle("-fx-padding: 10px;");

        Scene scene = new Scene(
            layout,
            125,
            100
        );

        dialog.setScene(scene);
        dialog.show();

        return dialog;
    }

    public static void main(String[] args) { launch(args); }
}

閉店時間出力

于 2013-07-24T21:01:57.513 に答える
1

分かった、気にしないで。物事は修正されました。ご不便をおかけして申し訳ありません。問題は、私Stageが静的であると宣言したことでした。

于 2013-07-24T20:33:51.250 に答える