更智能的方式来使用Java DocumentListener

时间:2014-10-08 19:27:41

标签: java swing validation jtextfield documentlistener

目前我在每个文本字段上使用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");
             }
        }
    });

4 个答案:

答案 0 :(得分:3)

  因为我这么重复我的自我。

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

  1. validateName(...)方法应在DocumentListener
  2. 中定义
  3. 请勿使用文本字段来获取文本。相反,您可以从文档中获取文本。 DocumentEvent引用了Document。
  4. 此外,您不会在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
});