1. ホーム
  2. java

[解決済み] JavaFX 入力検証用テキストフィールド

2022-02-15 17:01:38

質問

JavaFXとScene Builderを使用しており、テキストフィールドを持つフォームがあります。これらのテキストフィールドのうち3つは、文字列からdoubleにパースされます。

学校マークとしたいので、1.0から6.0までの値しか許されないはずです。ユーザは "2.34.4" のようなものを書くことはできませんが、 "5.5" や "2.9" のようなものは大丈夫でしょう。

パースされたフィールドのバリデーション。

public void validate(KeyEvent event) {
    String content = event.getCharacter();
    if ("123456.".contains(content)) {
            // No numbers smaller than 1.0 or bigger than 6.0 - How?
    } else {
        event.consume();
    }
}

ユーザーが正しい値を入力したかどうかをテストするにはどうすればよいですか?

StackoverflowやGoogleですでに検索しましたが、満足のいく解決策は見つかりませんでした。

どのように解決するのですか?

textField.focusedProperty().addListener((arg0, oldValue, newValue) -> {
        if (!newValue) { //when focus lost
            if(!textField.getText().matches("[1-5]\\.[0-9]|6\\.0")){
                //when it not matches the pattern (1.0 - 6.0)
                //set the textField empty
                textField.setText("");
            }
        }

    });

というパターンに変更することもできます。 [1-5](\.[0-9]){0,1}|6(.0){0,1} では 1,2,3,4,5,6 でも良いのですが(それだけではありません。 1.0,2.0,... )

アップデート ここでは、1(.00)から6(.00)までの値を許可した小さなテストアプリケーションを紹介します。

public class JavaFxSample extends Application {

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("Enter number and hit the button");
    GridPane grid = new GridPane();
    grid.setAlignment(Pos.CENTER);
    Label label1To6 = new Label("1.0-6.0:");
    grid.add(label1To6, 0, 1);
    TextField textField1To6 = new TextField();

    textField1To6.focusedProperty().addListener((arg0, oldValue, newValue) -> {
        if (!newValue) { // when focus lost
                if (!textField1To6.getText().matches("[1-5](\\.[0-9]{1,2}){0,1}|6(\\.0{1,2}){0,1}")) {
                    // when it not matches the pattern (1.0 - 6.0)
                    // set the textField empty
                    textField1To6.setText("");
                }
            }
        });
    grid.add(textField1To6, 1, 1);
    grid.add(new Button("Hit me!"), 2, 1);
    Scene scene = new Scene(grid, 300, 275);
    primaryStage.setScene(scene);
    primaryStage.show();
}

public static void main(String[] args) {
    launch(args);
}

}