推荐的方式来限制JavaFX的文本框输入(Recommended way to restrict i

2019-08-17 23:46发布

这似乎问题是重复此 。 但我的问题是,我有两种方式开发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();
    }
  }
});

我的问题是这是诽谤的方式来做到这一点? 谁能帮我去接吧?

Answer 1:

在文本字段添加验证,最好的办法是第三路。 这种方法可以让文本字段完成所有处理(复制/粘贴/撤销安全)。 它不需要你扩展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());
  }
);


Answer 2:

在您的两个方法,你不能键入字符其他然后数字字符。 但它将允许(从任何来源复制文本,并在你的文本字段粘贴)粘贴任何字符存在。

做验证的一个好办法就是提出申请后,

等(整数):

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

(也可以使用你的+上述方法的任何组合)



Answer 3:

JavaFX的有一个类的TextFormatter这个用例。 它可以让你验证之前它是“COMMITED”在调整文本内容textProperty的的TextField

见下面的例子:

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


Answer 4:

类似的什么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)

有可能是一个更短的方式做到这一点的常规。 如果你知道的话,请在这里发表它。



文章来源: Recommended way to restrict input in JavaFX textfield