13

问题似乎是this的副本。但我的问题是我通过两种方式在 JavaFX 中开发了一个整数文本字段。代码如下

public class FXNDigitsField extends TextField
{
private long m_digit;
public FXNDigitsField()
{
    super();
}
public FXNDigitsField(long number)
{
    super();
    this.m_digit = number;
    onInitialization();
}

private void onInitialization()
{
    setText(Long.toString(this.m_digit));
}

@Override
public void replaceText(int startIndex, int endIndex, String text)
{
    if (text.matches(Constants.DIGITS_PATTERN) || text.equals(Constants.EMPTY_STRING)) {
        super.replaceText(startIndex, endIndex, text);
    }
}

@Override
public void replaceSelection(String text)
{
    if (text.matches(Constants.DIGITS_PATTERN) || text.equals(Constants.EMPTY_STRING)) {
        super.replaceSelection(text);
    }
}
}

第二种方法是添加一个事件过滤器。

给出了代码片段。

 // restrict key input to numerals.
this.addEventFilter(KeyEvent.KEY_TYPED, new EventHandler<KeyEvent>() {
  @Override public void handle(KeyEvent keyEvent) {
    if (!"0123456789".contains(keyEvent.getCharacter())) {
      keyEvent.consume();
    }
  }
});

我的问题是,这样做的诽谤方式是什么?任何人都可以帮我拿起权利吗?

4

5 回答 5

12

在 TextField 中添加验证的最佳方式是第三种方式。此方法让 TextField 完成所有处理(复制/粘贴/撤消安全)。它不需要您扩展 TextField 类。它允许您决定在每次更改后如何处理新文本(将其推送到逻辑,或返回到以前的值,甚至修改它)。

// fired by every text property changes
textField.textProperty().addListener(
  (observable, oldValue, newValue) -> {
    // Your validation rules, anything you like
    // (! note 1 !) make sure that empty string (newValue.equals("")) 
    //   or initial text is always valid
    //   to prevent inifinity cycle
    // do whatever you want with newValue

    // If newValue is not valid for your rules
    ((StringProperty)observable).setValue(oldValue);
    // (! note 2 !) do not bind textProperty (textProperty().bind(someProperty))
    //   to anything in your code.  TextProperty implementation
    //   of StringProperty in TextFieldControl
    //   will throw RuntimeException in this case on setValue(string) call.
    //   Or catch and handle this exception.

    // If you want to change something in text
    // When it is valid for you with some changes that can be automated.
    // For example change it to upper case
    ((StringProperty)observable).setValue(newValue.toUpperCase());
  }
);
于 2014-10-31T08:26:26.073 回答
5

在这两种方式中,您都不能输入数字字符以外的字符。但它允许在那里粘贴任何字符(从任何来源复制文本并粘贴到您的 TextField 中)。

进行验证的一个好方法是在提交之后,

喜欢(对于整数):

try {
    Integer.parseInt(myNumField.getText());
} catch(Exception e) {
    System.out.println("Non-numeric character exist");
}

(或者您可以使用您的任意组合+上述方法)

于 2013-05-24T04:44:48.917 回答
5

JavaFX为这个用例提供了一个TextFormatter类。它允许您在将文本内容“提交”textPropertyTextField.

看这个例子:

TextFormatter<String> textFormatter = new TextFormatter<>(change -> {
    if (!change.isContentChange()) {
        return change;
    }

    String text = change.getControlNewText();

    if (isValid(text)) { // your validation logic
        return null;
    }


    return change;
});

textField.setTextFormatter(textFormatter);
于 2018-04-18T17:16:05.140 回答
0

此代码片段仅允许用户在 TextField 中输入数字。

    /**
     * This will check whether the incoming data from the user is valid.
     */
    UnaryOperator<TextFormatter.Change> numberValidationFormatter = change -> {
        if (change.getText().matches("\\d+")) {
            return change; //if change is a number
        } else {
            change.setText(""); //else make no change
            change.setRange( //don't remove any selected text either.
                    change.getRangeStart(),
                    change.getRangeStart()
            );
            return change;
        }
    };
    
     
    TextFormatter tf = new TextFormatter(numberValidationFormatter);
    
    textfield.setTextFormatter(tf);
于 2021-03-06T11:22:52.000 回答
0

Manuel Mauky发布的内容类似,但在groovy

注意:这将阻止输入除数字之外的任何其他字符。

def digitsOnlyOperator = new UnaryOperator<TextFormatter.Change>() {
        @Override
        TextFormatter.Change apply(TextFormatter.Change change) {
            return !change.contentChange || change.controlNewText.isNumber() ? change : null
        }
}
textField.textFormatter = new TextFormatter<>(digitsOnlyOperator)

在 groovy 中可能有一种更短的方法。如果您知道,请在此处发布。

于 2019-01-11T04:37:09.723 回答