[英]JavaFX: How to handle text selection on textField with event handler?
我有一個帶有以下事件處理程序的javaFX文本字段:
public static EventHandler<KeyEvent> numericValidation(final Integer maxLengh) {
return new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
TextField txt_TextField = (TextField) e.getSource();
if (txt_TextField.getText().length() >= max_Lengh) {
e.consume();
}
if(!e.getCharacter().matches("[0-9]")){
e.consume();
}
}
};
}
...
yearTextField.addEventFilter(KeyEvent.KEY_TYPED , numeric_Validation(4));
這應該確保文本字段只能接受最大為maxLength
位的數字。 問題是,現在如果我從文本字段中選擇一些文本(一些數字),然后嘗試寫其他數字,它將無能為力。 我希望將所選文本替換為我正在編寫的文本,就像它與基本文本字段一樣,只要它是數字並且不會超過maxLength
的長度即可。 我該如何實現?
使用使用UnaryOperator
作為構造函數參數創建的TextFormatter
。 這個UnaryOperator
接收一個對象,該對象除其他信息外還包含輸入所產生的新文本。 您可以返回影響結果的修改后的更改,或者直接為輸入返回null
而不修改TextField
。
如果您將多個數字復制並粘貼到TextField
,則使用此方法的代碼也可以使用...
例:
int maxLength = 8;
final String matchString = "\\d{0," + maxLength + "}"; // allow 0 to maxLength digits
TextField textField = new TextField();
TextFormatter<?> formatter = new TextFormatter<>(change -> {
String newText = change.getControlNewText();
return newText.matches(matchString) ? change : null;
});
textField.setTextFormatter(formatter);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.