【问题标题】:Smarter way to use Java DocumentListener使用 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");
             }
        }
    });

【问题讨论】:

  • 据我所知,这是有史以来最聪明的方法

标签: java swing validation jtextfield documentlistener


【解决方案1】:

因为我在重复我自己。

创建一个可以添加到任何文本字段的通用 DocumentListener 即:

  1. validateName(...) 方法应该在 DocumentListener 中定义
  2. 不要使用文本字段来获取文本。相反,您可以从文档中获取文本。 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
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多