JavaFX TextField-只允许输入一个字母

我正在尝试用JavaFX制作数独游戏,但我不知道如何只允许输入一个字母。对此的答案是调用文本字段并执行以下操作:

myTextField.setOnKeyPressed(e ->

{

if (!myTextField.getText().length().isEmpty())

{

// Somehow reject the key press?

}

}

上面的方法不适用于复制粘贴…或大量其他事情,等等。像这样使用按键监听器似乎是一个AWFUL想法。一定有更好的东西吗?是否存在文本字段的属性,仅允许输入某些字符,或仅允许输入一定数量的字符?

谢谢!

回答:

您可以使用TextFormatter来执行此操作。该TextFormatter可以修改都在文本字段做,如果有一个与之关联的过滤器的变化。过滤器是接受TextFormatter.Change对象并返回相同类型的对象的函数。它可以null完全否决更改,也可以对其进行修改。

所以你可以做

TextField textField = new TextField();

textField.setTextFormatter(new TextFormatter<String>((Change change) -> {

String newText = change.getControlNewText();

if (newText.length() > 1) {

return null ;

} else {

return change ;

}

});

请注意,尽管TextFormatter也可以使用将该文本转换为您喜欢的任何类型的值。在您的情况下,将文本转换为Integer,并且仅允许整数输入是有意义的。作为最终的用户体验,您可以修改更改,以便如果用户键入数字,它将替换当前内容(如果字符太多,则不要忽略它)。整个过程看起来像这样:

    TextField textField = new TextField();

// converter that converts text to Integers, and vice-versa:

StringConverter<Integer> stringConverter = new StringConverter<Integer>() {

@Override

public String toString(Integer object) {

if (object == null || object.intValue() == 0) {

return "";

}

return object.toString() ;

}

@Override

public Integer fromString(String string) {

if (string == null || string.isEmpty()) {

return 0 ;

}

return Integer.parseInt(string);

}

};

// filter only allows digits, and ensures only one digit the text field:

UnaryOperator<Change> textFilter = c -> {

// if text is a single digit, replace current text with it:

if (c.getText().matches("[1-9]")) {

c.setRange(0, textField.getText().length());

return c ;

} else

// if not adding any text (delete or selection change), accept as is

if (c.getText().isEmpty()) {

return c ;

}

// otherwise veto change

return null ;

};

TextFormatter<Integer> formatter = new TextFormatter<Integer>(stringConverter, 0, textFilter);

formatter.valueProperty().addListener((obs, oldValue, newValue) -> {

// whatever you need to do here when the actual value changes:

int old = oldValue.intValue();

int updated = newValue.intValue();

System.out.println("Value changed from " + old + " to " + new);

});

textField.setTextFormatter(formatter);

以上是 JavaFX TextField-只允许输入一个字母 的全部内容, 来源链接: utcz.com/qa/426336.html

回到顶部