使用 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

JTextArea DocumentListener 问题

如何在 Netbeans 中使用 DocumentListener 和 jTextField?

从 DocumentListener 获取更改的文本

DocumentListener 无法正常工作