JavaFXで数独(ナンバープレイ)プログラムもどきを作成していて、textFieldで数字1文字のみ入力可能との入力制限をかけたくなったのですが、.NetのMaxLengthのようなプロパティはありません。Netをググると ここに
[JavaFX] バリデーション機能付きTextFieldを実装する としてドンピシャな記事をみつけました。早速まるまるコピーして実行すると・・ なんと Javaのバージョンの違いからか コンパイルでエラーが!!
C:\netbeansProj\Numplay\src\com\nobotta\numplay\RestrictedTextField.java:31: 警告: [unchecked] 無検査変換 if (verifier == null) verifier = new SimpleObjectProperty(this, "Verifier"); 期待値: ObjectProperty<Pattern> 検出値: SimpleObjectProperty
プログラマーの脳みそによるとどうも参考にしたソースのハイライト部分に
public ObjectProperty<Pattern> verifierProperty() { if (verifier == null) verifier = new SimpleObjectProperty(this, "Verifier"); return verifier; }
public ObjectProperty<Pattern> verifierProperty() { if (verifier == null) verifier = new SimpleObjectProperty<Pattern>(this, "Verifier"); return verifier; }
とすることで エラーもなくなり 目的を達成しました。
作成したクラスのソース全体を以下に示します。
package com.nobotta.numplay; import java.util.regex.Pattern; import javafx.beans.property.IntegerProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; public class RestrictedTextField extends javafx.scene.control.TextField { private IntegerProperty maxLength; public void setMaxLength(int value) { maxLengthProperty().set(value); } public int getMaxLength() { return maxLengthProperty().get(); } public IntegerProperty maxLengthProperty() { if (maxLength == null) maxLength = new SimpleIntegerProperty(this, "Maximum Length", -1); return maxLength; } private ObjectProperty<Pattern> verifier; public void setVerifier(Pattern value) { verifierProperty().set(value); } public Pattern getVerifier() { return verifierProperty().get(); } public ObjectProperty<Pattern> verifierProperty() { if (verifier == null) verifier = new SimpleObjectProperty<Pattern>(this, "Verifier"); return verifier; } public static final Pattern NUMBER_ONLY; public static final Pattern ALPHABET_ONLY; static { NUMBER_ONLY = Pattern.compile("[0-9]"); ALPHABET_ONLY = Pattern.compile("[a-z]", Pattern.CASE_INSENSITIVE); } @Override public void replaceText(int start, int end, String text) { // If the replaced text would end up being invalid, then simply // ignore this call! if (text.equals("")) { super.replaceText(start, end, text); } else { if (getMaxLength() > 0 && getLength() < getMaxLength()) { if (getVerifier().matcher(text).find()) { super.replaceText(start, end, text); } } } } @Override public void replaceSelection(String text) { if (text.equals("")) { super.replaceSelection(text); } else { if (getMaxLength() > 0 && getLength() < getMaxLength()) { if (getVerifier().matcher(text).find()) { super.replaceSelection(text); } } } } }