(JavaFX)バリデーション機能付き textField

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);
                }
            }
        }
    }
}
スポンサーリンク
Rectangle大広告
Rectangle大広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする