JavaFX Input Validation Textfield

帅比萌擦擦* 提交于 2019-12-30 09:57:38

问题


I'm using JavaFX and Scene Builder and I have a form with textfields. Three of these textfields are parsed from strings to doubles.

I want them to be school marks so they should only be allowed to be between 1.0 and 6.0. The user should not be allowed to write something like "2.34.4" but something like "5.5" or "2.9" would be ok.

Validation for the parsed fields:

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

How can I test if the user inputs a correct value?

I already searched on Stackoverflow and on Google but I didn't find a satisfying solution.


回答1:


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

    });

you could also change the pattern to [1-5](\.[0-9]){0,1}|6(.0){0,1} then 1,2,3,4,5,6would also be ok (not only 1.0,2.0,...)

update Here is a small test application with the values 1(.00) to 6(.00) allowed:

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

}



回答2:


I would not advise you to use KeyEvent for that.

You should use a more classical way such as validated the user input when the user finish to fill the text field or click on a save button.

/**
 * Called this when the user clicks on the save button or finish to fill the text field.
 */
private void handleSave() {
        // If the inputs are valid we save the data
        if(isInputValid()){
            note=(DOUBLE.parseDouble(textField.getText()));
        }else // do something such as notify the user and empty the field
}

/**
 * Validates the user input in the text fields.
 * 
 * @return true if the input is valid
 */
private boolean isInputValid() {
    Boolean b= false;
    if (!(textField.getText() == null || textFiled.getText().length() == 0)) {
        try {
            // Do all the validation you need here such as
            Double d = Double.parseInt(textFiled.getText());
            if ( 1.0<d<6.0){
                b=true;
            }
        } catch (NumberFormatException e) { 
        }
    return b;
}



回答3:


In case you can use a third party library:

Similar question has been aswered here: Form validator message .

For your case, you would choose a RegexValidator to check the textfield input, and pass the regex that you arrived to from previous answers:

    JFXTextField validationField = new JFXTextField();
    validationField.setPromptText("decimal between 1.0 and 6.0");
    RegexValidator validator = new RegexValidator();
    validator.setRegexPattern("[1-5](\\.[0-9]{1,2}){0,1}|6(\\.0{1,2}){0,1}");
    validator.setMessage("Please enter proper value");
    validationField.getValidators().add(validator);
    validationField.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if(!newValue)
                validationField.validate();
    });


来源:https://stackoverflow.com/questions/30935279/javafx-input-validation-textfield

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!