目前我在每个文本字段上使用DocumentListener,以实时验证用户输入,但我认为必须有一个更聪明的方法,因为我正在重复我的自我。
有更聪明的方法吗?
nameJTextField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
validateName(nameJTextField.getText());
}
@Override
public void removeUpdate(DocumentEvent e) {
validateName(nameJTextField.getText());
}
@Override
public void changedUpdate(DocumentEvent e) {
}
private void validateName(String name) {
if (name.matches("^[A-ZÆØÅa-zæøå0-9]{2,40}$")) {
errorNameJLabel.setText("");
} else {
errorNameJLabel.setText("Min 2 and max 40 letters and numbers");
}
}
});
答案 0 :(得分:3)
因为我这么重复我的自我。
创建一个通用的DocumentListener,您可以将其添加到任何文本字段:
此外,您不会在changedUpdate(...)方法中进行验证。该方法仅用于在使用JTextPane或JEditorPane时更改文本中的属性(字体,颜色等)。
在不知道验证细节的情况下,很难给出更具体的答案。
答案 1 :(得分:1)
不在内置java中。我使用DocumentListeners做了很多,并希望这样做,所以我创建了自己的类:
https://github.com/MattPutnam/Common/blob/master/src/common/swing/DocumentAdapter.java
随意复制/粘贴。
答案 2 :(得分:1)
如果您想将错误消息放在其他位置,您的方法就可以了。
我个人喜欢使用JFormattedTextField
(至少是它的拉皮条版本)。
java.text.Format
来格式化/解析输入。 PropertyChangeEvents
属性的事件(value
)。无效输入不会导致事件。易于例如在表单上启用提交按钮。可以在this question中找到有关数字的示例。
答案 3 :(得分:1)
只需创建一个扩展DocumentListener并实现所有DocumentListener方法的接口:
@FunctionalInterface
public interface SimpleDocumentListener extends DocumentListener {
void update(DocumentEvent e);
@Override
default void insertUpdate(DocumentEvent e) {
update(e);
}
@Override
default void removeUpdate(DocumentEvent e) {
update(e);
}
@Override
default void changedUpdate(DocumentEvent e) {
update(e);
}
}
然后:
jTextField.getDocument().addDocumentListener(new SimpleDocumentListener() {
@Override
public void update(DocumentEvent e) {
// Your code here
}
});
或者您甚至可以使用lambda表达式:
jTextField.getDocument().addDocumentListener((SimpleDocumentListener) e -> {
// Your code here
});