日記#780#781

#780 9月18日

どうやら設定は上手くいっていたようだったが、条件分岐が悪かった。
今回の条件分岐は最終的に下記のようになった。

TextField textfield_2 = new TextField("1");
textfield_2.focusedProperty().addListener(new ChangeListener<Boolean>() {
    public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue,
            Boolean newPropertyValue) {
        if (!newPropertyValue) {

            System.out.println("focus out");
            String checkstr = textfield_2.getText();
            System.out.println(checkstr);

            if (checkstr.matches("[0-4]")) {
                System.out.println("そのままにします");

            } else {
                textfield_2.setText("0");
                System.out.println("0に修正したよ");
            }
        }
    }
});

結果はこちら。
focus outと記載のある部分がtextfieldから選択が外れた時に記載されるコメントである。
その下がtextfieldに記載された文字でその後どんな処理をしたかをその下に記載している。

focus out
3
そのままにします
focus out
a
0に修正したよ
focus out
-180
0に修正したよ
focus out
65
0に修正したよ
focus out
-/?
0に修正したよ

結果は望むような内容であったし、画面の挙動(省略)も望むものであった。

今回、上手くいっていなかった理由としては、修正側(else側)をelse lf([^0-4])としていたことだ。
この条件式の本来の意味は"0〜4以外の1文字の場合"になる。
私はそれを"0〜4以外の任意文字数の場合"と勘違いしてしまっていた。そのため、先日は上手くいっていなかったのだ。

今回こうなった理由としては私は普段"ifとelse(それかそれ以外か)"で条件式を記載しない癖がついてしまっていることが挙げられる。
普段は条件を明確にした条件分岐をしたいと考えているため"Ifとelse if(それかそれ以外のこれか)"を使用することが多い。
ただし、今回に限ってはそれをするとelse ifで指定することになる条件"任意文字数の0〜4以外の文字、数字、記号全て"を指定しないといけない。
これはさすがに骨が折れるので、今回のようにそれ以外側の条件を明記するにはあまりにも非現実的な場合はelseに頼った方が良いことを思い知った。

話は少し変わって今回実は上手くいっていたことが分かった件について記載する。
これはやはりログを記載(System.out.println)したことが大きい。
やはり躓いた時には1つ1つ丁寧に怪しい場所にログ出力処理を書き込むに限る、と改めて感じた。

さて、今度は話を大きく変わる。
普段私たちはTabキーを押すと次のオブジェクトに移動する機能を使用している。
例えば、検索窓に文字を入力してTabキーを押すと検索ボタンに、選択していることを明示する枠のようなものが表示される。
これが今回で言うところのfocusというものになるのだが、これは元々備わっているものでは無い。
つまり、こちら側でTabキーを押した時の処理を追加してあげないといけないかもしれないということだ。
私も普段からTabキーによる選択遷移に関しては非常に便利が故に使用させていただいているため、こちらでも実装したいと考えてはいるのだが、これはこれで大変なような気がしているのだ。
1つでまとまればいいのだが、オブジェクト毎に追加してあげないといけないとなった場合にはちょっと嫌だなと思ってしまうのだ。

次回はtextfieldで入力完了後にEnterキーを押した際にも今回の0〜4以外の入力を0に強制する処理とTabキーを押した時のオブジェクトの選択遷移処理を追加できればと思う。

#781 9月19日

今日はなにもできず終了。

この記事が気に入ったらサポートをしてみませんか?