プロジェクト

全般

プロフィール

JavaFXとテキスト入力

TextField、Spinnerなどのテキスト入力部品の使い方メモです。

入力したテキストのチェック

入力するテキストの制限

TextFieldを数値入力専用とする

javafx.scene.control.TextFormatter<V> を使って入力するテキストの書式を指定します。

小数の入力

@FXML TextField decimalField;
  :
public void initialize(URL location, ResourceBundle resources) {
    decimalField.setTextFormatter(new TextFormatter<>(new DoubleStringConverter()));
      :

テキストフィールドに文字列を入力後、そのテキストフィールドからフォーカスが外れたときに文字列を小数形式に書式化します。
例えば、テキストフィールドに[123a]と入力しフォーカスを移した時点でテキストフィールドの文字列は123に書式化(変更)されます。

テキストフィールドに入力した文字列から小数値を取り出す際、TextFieldからgetTextで文字列を取得し、Double.parseDouble(text)で小数値に変換していましたが、このTextFormatterのgetValueおよびsetValueメソッドを使うと文字列・数値変換を記述しなくて済みます。

TextFormatter<> textFormatter = new TextFormatter<>(new DoubleStringConverter());
decimalField.setTextFormatter(textFormatter);
  :
double value = textFormatter.getValue();

ただし、getValue()で型安全に意図した型の数値を取るには、TextFormatterを生成時にその参照を取っておくことが必要です。
TextFieldに設定したTextFormatterを、後からgetTextFormatterで取得すると型情報が失われているのでキャストが発生します。

マウスホイールでの増減

TextFieldの数値をマウスホイールで増減する

@FXML TextField decimalField;
  :
public void initialize(URL location, ResourceBundle resources) {
    var formatter = new TextFormatter<>(new DoubleStringConverter());
    decimalField.setTextFormatter(formatter);
    decimalField.setOnScroll(event -> {
        if (event.getDeltaY() < 0) {
            formatter.setValue(formatter.getValue() - 1);
        } else {
            formatter.setValue(formatter.getValue() + 1);
        }
    });