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);
}
});