使用 Java DocumentListener 的更聪明的方法
Posted
技术标签:
【中文标题】使用 Java DocumentListener 的更聪明的方法【英文标题】:Smarter way to use Java DocumentListener 【发布时间】:2014-12-03 14:01:36 【问题描述】:目前我在每个文本字段上使用 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");
);
【问题讨论】:
据我所知,这是有史以来最聪明的方法 【参考方案1】:因为我在重复我自己。
创建一个可以添加到任何文本字段的通用 DocumentListener 即:
-
validateName(...) 方法应该在 DocumentListener 中定义
不要使用文本字段来获取文本。相反,您可以从文档中获取文本。 DocumentEvent 具有对 Document 的引用。
此外,您不会在 changedUpdate(...) 方法中进行验证。该方法仅用于在使用 JTextPane 或 JEditorPane 时更改文本中的属性(字体、颜色等)。
如果不知道验证的详细信息,很难给出更具体的答案。
【讨论】:
我已经改变了它,这样我就有了DocumentListener里面的验证方法。所以我可以创建一个更通用的类,可能针对每种类型的验证,然后创建 DocumentListener 的对象,例如字符串验证? 没错,也许你需要传入参数来让类更通用。例如最大字符串长度。您还可以查看您可能可以使用的JFormattedTextField
。此外,DocumentFilter
可能是一种更好的方法,因为它会在更新文档之前进行验证,这样您就可以防止将不需要的数据输入到文档中。【参考方案2】:
没有在内置的java中。我在 DocumentListeners 上做了很多事情,并且想要做到这一点,所以我自己创建了一个类:
https://github.com/MattPutnam/Common/blob/master/src/common/swing/DocumentAdapter.java
随意复制/粘贴。
【讨论】:
我对 Java 还很陌生,所以我的问题似乎很明显,但我将如何使用它? 像往常一样将其添加为 DocumentListener,然后覆盖 documentChanged 方法 我决定在您设计的课程中使用您的方法。它简单快捷。从长远来看,我会尝试实施@camickr 的解决方案。【参考方案3】:如果您想将错误消息放在另一个位置,您的方法很好。
我个人喜欢使用JFormattedTextField
(或至少是它的拉皮条版本)。
java.text.Format
来格式化/解析输入。
当输入无效时,我更改背景颜色,以便用户清楚哪个字段不正确。在创建多个字段可能同时不正确的表单时非常方便。
只有在输入有效输入时,您才会获得事件(PropertyChangeEvents
用于 value
属性)。无效输入不会导致事件。易于例如在表单上启用提交按钮。
可以在this question 中找到有关数字的示例。
【讨论】:
【参考方案4】:只需创建一个扩展 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
);
【讨论】:
以上是关于使用 Java DocumentListener 的更聪明的方法的主要内容,如果未能解决你的问题,请参考以下文章
Swing JTextField 文本更改侦听器 DocumentListener 无限循环
如何知道啥 JTextField 进入 DocumentListener