JavaFXのDialogで入力値チェック制御


この記事について

将来的に書く予定の「JavaFX で DynamoDB Viewer作ってみた」記事の1ステップ。
結構大きな話になると思うので、少しずつ技術ポイント毎に記事を書いて、ある一定程度の要件を満たせた段階で前述まとめ記事書く予定。

第一回記事:DynamoDBの情報を読み込んでJavaFXで表示してみる
第二回記事:JavaFXで動的にテーブル列を設定する
第三回記事:AWS java SDKでDynamoDBテーブル情報を取得してみる
第四回記事:JavaFX の TableView の選択範囲をクリップボードにコピーする。
第五回記事:JavaFX でコンポーネント作って動的生成してみる
第六回記事:DynamoDBのデータ型をjava SDKから把握してみる。
第七回記事:JavaFXでジェネリック使って入力ダイアログ作成してみる
第八回記事:JavaFXで各種サイズ制御

※これまでの記事が基本になってます。メソッドなど細かい部分で再説明していない部分があります。不明点などありましたらコメントなど頂けたら対応しようと思います。

今回の追加機能

各種属性追加、値の編集が出来る様に
要素数が多い時、ウィドウサイズが大きすぎない様に
Map型ダイアログの要素順を要素の型でソートする様に
要素に下線を引き、要素の情報を見やすい様に
ダイアログのタイトルに、どの情報かを表示する様に

現在の進捗

基本ダイアログ

子ダイアログ

この時点でのソース(github)

技術ポイント

入力ダイアログのValidation

ダイアログでOKボタンが押された時、値の最終チェックをし、駄目だったら警告アラート出してダイアログを閉じずに入力継続したい。
Dialog#setOnCloseRequest で、チェック関数を指定。そのチェック関数の中で、チェックが駄目だったら dialogEvent.consume()を実行する事で実現可能。
ただ、取り消しボタンでもチェックが走ってしまう。今の時点では対応方法が見つからず、一旦そのまま。

Dialog継承クラス

    // コンストラクタ辺りでセットする
    this.setOnCloseRequest(this::doFinalValidation);

    // チェック関数
    private void doFinalValidation(DialogEvent dialogEvent) {
        if (!isFinalValidationOk()) {
            dialogEvent.consume();
        }
    }

ダイアログの最大&最小サイズ指定

画面のサイズを最大値に。最小値は幅300、高さ200

        Rectangle2D screenSize2d = Screen.getPrimary().getVisualBounds();
        double screenHeight = screenSize2d.getHeight();
        double screenWidth = screenSize2d.getWidth();

        final Window window = this.getDialogPane().getScene().getWindow();
        Stage stage = (Stage) window;
        stage.setMinHeight(200);
        stage.setMinWidth(300);
        stage.setMaxHeight(screenHeight);
        stage.setMaxWidth(screenWidth);

その他のポイント

  • コンストラクタ時点では、インスタンス宣言部でNodeを生成しても参照できない。
  • 当たり前だが、継承元と継承先で関数記述の順番をそろえておくと後々確認する時に楽。

次回予定

検索部分の強化(PartiQLとか)

残課題

  • 取り消しボタンでもチェックが走ってしまう
  • 新要素を追加した時、テーブルに列が追加されない

参考にさせて頂いたページ

JavaFX Dialogs: How to set min-size and prevent closing?

[Dialog] add method to suppress closing of dialogs