TextField を 0 から 9 までの数値しか入力できないようにしてみた

このプログラムは TextField に入力制限をかけたいなぁって思ってどうすればいいんだろう?ってネットサーフィンしていたときに見つけたものです。

Java 8u40 では Formatted Text が追加されるらしいのですが、お試し版を使ったサンプルコードの紹介がまだ見当たらない現状なのでφ(..)メモメモ

ちなみに Alert Dialogs はみんな待っているのでサンプルコードはもう出ていますね。

あと、Spinner も追加されるようです。

JavaFX はまだまだ足りないものがあるとあちこちで言われていますが着実に進化しているようです。

それでは忘備録として下記コードを書き留めておきます。

package jp.yucchi.numbersonlytextfield;

import java.awt.Toolkit;
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

/**
 *
 * @author Yucchi
 */
public class NumbersOnlyTextField extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        
        TextField textField = new TextField();
        textField.setAlignment(Pos.CENTER_RIGHT);
        Label label = new Label();
        label.setAlignment(Pos.CENTER_RIGHT);
        label.setPadding(new Insets(0, 7, 0, 5));
        
        FlowPane root = new FlowPane();
        
        root.getChildren().addAll(textField, label);
        
        Scene scene = new Scene(root, 300, 60);
        
        textField.prefWidthProperty().bind(scene.widthProperty());
        textField.prefHeightProperty().bind(scene.heightProperty().divide(2));
        label.prefWidthProperty().bind(scene.widthProperty());
        label.prefHeightProperty().bind(scene.heightProperty().divide(2));
        
        textField.lengthProperty().addListener((ObservableValue observable, Number oldValue, Number newValue) -> {
            if (newValue.intValue() > oldValue.intValue()) {
                char ch = textField.getText().charAt(oldValue.intValue());
                if (!(ch >= '0' && ch <= '9')) {
                    Toolkit.getDefaultToolkit().beep();
                    textField.setText(textField.getText().substring(0, textField.getText().length() - 1));
                }
            }
        });
        
        label.textProperty().bind(textField.textProperty());
        
        primaryStage.setTitle(this.getClass().getSimpleName());
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
}

このプログラムは TextField の lengthProperty にリスナーを登録して入力した値を判定して処理してます。

これだと何かしらのイベント発生時に TextField の入力値を取得して正規表現で判定して問題あればアラートダイアログ出して入力し直してもらうという方法より場合によってはいいかもしれません。

小ネタですがもう暫くは活躍してもらえそうです。(^_^)

Hatena タグ:

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です