質問: txtEmployeeCode.getText().concat(keyEvent.getCharacter()); // try { // Integer.parseInt(input); // btnConfirm.setDisable(false); // lblErrorMessage.setText(""); // } catch(NumberFormatException nfe) { // btnConfirm.setDisable(true); // if(input.trim().length() > 0) { // lblErrorMessage.setText("数字のみ入力してください"); // } else { // lblErrorMessage.setText(""); // } // } } @FXML public void actionConfirm (ActionEvent event) { //確認画面へ遷移する処理 } ``` ### できたこと * 未入力時にボタンを無効に、入力時はボタンを有効にすることはできる * txtEmployeeCodeのKeyTypedイベント処理では実現可能 ### できなかったこと プロパティバインドでの * 入力時に数値でないときのチェックの方法がわからない * エラー時に即時エラーメッセージを表示する方法がわからない --- よろしくお願いします。
回答: ご質問のようなことも可能です。またbindを使うと依存する値が変化すると即座にbindしたプロパティに反映されます。例えば確認ボタンをdisableにすべき条件が(1)、エラーメッセージを表示すべき状態が(2)でこれ以外の状態はない場合だとすると、 (1)社員コードに正しい数値が入力されているとき以外(未入力も) (2)社員コードが空でなくかつ数値以外がが入力されている場合 ``` BooleanBinding codeIsInvalid = Bindings.createBooleanBinding( () -> { String s = txtEmployeeCode.getText(); try { int employeeCode = Integer.parseInt(s); return false; } catch (NumberFormatException e) { //必要ならNPEなども補足 return true; } }, txtEmployeeCode.textProperty()); btnConfirm.disableProperty().bind(codeIsInvalid); BooleanBinding codeNotEmptyAndInvalid = codeIsInvalid.and(txtEmployeeCode.textProperty().isEmpty().not()); StringBinding message = new When(codeNotEmptyAndInvalid) .then("コードが正しくありません").otherwise("")); lblErrorMessage.textProperty().bind(message); ``` ご存知かも知れませんが通常の片方向バインドは一つのプロパティへは只一つのバインドしかできませんし、一時的に他の値を設定したくてもできなくなります。プロパティの値はバインドした値に支配されてしまうからです。Bindingはいくらでも複雑に作れますが却ってわかりにくくなるようだとイベントによる処理の方がいいかも知れませんね。