扩展 addDocumentListener 的功能

发布于 2025-01-02 19:10:19 字数 1464 浏览 5 评论 0原文

我有一个扩展 javax.swing.JTextField 的文本字段,并且还有像这样的文档侦听器

public class MyTetField extends javax.swing.JTextFiled{
     public MyTextField(){
          super();
          // Document listener to check mandatory functionality
          getDocument().addDocumentListener(new javax.swing.event.DocumentListener() {
            /**
             * If the text is changed then this event will be fired.
             */
            public void changedUpdate(javax.swing.event.DocumentEvent e) {
            }
            /**
             * If some value is removed then this event is fired.
             */
            public void removeUpdate(javax.swing.event.DocumentEvent e) {
            }
            /**
             * If some value is auto set, this event will be called
             * @param e The value change event
             */
            public void insertUpdate(javax.swing.event.DocumentEvent e) {
                if (getText().trim().equals("")){
                    setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.RED));
                }else{
                    setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.GRAY));
                }
            }
        });
     }
}

现在我想要另一个文本字段,例如 MyTextField1extending MyTextField 应该进行此强制检查,并在检查强制字段以及是否给出了某些值后从数据库获取一些信息。我不想在其中编写相同的文档侦听器代码。是否可以扩展我们在 MyTextField 中添加的文档侦听器,或者我应该使用焦点侦听器?

I've a text field which extends javax.swing.JTextField and also have document listener like this

public class MyTetField extends javax.swing.JTextFiled{
     public MyTextField(){
          super();
          // Document listener to check mandatory functionality
          getDocument().addDocumentListener(new javax.swing.event.DocumentListener() {
            /**
             * If the text is changed then this event will be fired.
             */
            public void changedUpdate(javax.swing.event.DocumentEvent e) {
            }
            /**
             * If some value is removed then this event is fired.
             */
            public void removeUpdate(javax.swing.event.DocumentEvent e) {
            }
            /**
             * If some value is auto set, this event will be called
             * @param e The value change event
             */
            public void insertUpdate(javax.swing.event.DocumentEvent e) {
                if (getText().trim().equals("")){
                    setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.RED));
                }else{
                    setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.GRAY));
                }
            }
        });
     }
}

Now I want another text field say MyTextField1extending MyTextField which should have this mandatory check and also to get some information from DB after checking mandatory field and if some value is given. I do not want to write the same document listener code in that. Is it possible to extend document listener which we added in MyTextField OR should I go for focus listener?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

扬花落满肩 2025-01-09 19:10:20
  1. 无需为您正在做的事情扩展JTextField。大多数时候,不需要扩展 Swing 组件。
  2. 您的侦听器在 MyTextField 类中执行的操作看起来与 JFormattedTextField 的操作非常相似。您可能需要考虑使用该类。
  3. 要真正回答您的问题,您可以扩展您的 MyTextField 类,然后添加另一个 DocumentListener 来执行一些额外的检查。您将保留原始功能,因为超类将添加自己的 DocumentListener
  1. There is no need to extend JTextField for what you are doing. Most of the times, there is no need to extend the Swing components.
  2. What your listener does in your MyTextField class looks remarkably similar to what a JFormattedTextField does. You might want to consider using that class instead
  3. To actually answer your question, you can extend your MyTextField class and just add another DocumentListener which does some extra checks. You will keep your original functionality since the super class will add its own DocumentListener
半衾梦 2025-01-09 19:10:20

根据您的描述,我假设您需要对文档更改进行视觉反馈验证,其中确切的验证规则是变量。如果是这样,将其分解为

  • 一个验证接口,该接口检查一个字符串值
  • ,一个控制器使用该验证来决定是否/如何根据验证结果装饰给定的 textComponent

一些伪代码

public interface TextPredicate {
     public boolean isValid(String text);
}

public class NotEmptyTextPredicate implements TextPredicate {
     // imlemented to return true/false for not/empty text
}

public class OnChangeValidator  {
     private TextPredicate predicate;
     private JTextComponent textComponent;
     private DocumentListener listener;

     public OnChangeValidator(JTextComponent component, TextPredicate predicate) {
          // assign and register the listener
          this.predicate = ....
          ...
          this.listener = create...
          component.getDocument().addDocumentListener(listener); 
     }

     protected void validate() {
         decorate(predicate.isValid(textComponent.getText())
     }

     protected void decorate(boolean valid) {
        if (valid) {
           // set normal visual properties
        } else {
          // set error visual properties
     }   


     protected DocumentListener createDocumentListener() {  
        DocumentListener l = new DocumentListener() {
          @Override
          public void insertUpdate(...) {
              validate();
          }

          @Override
          public void removeUpdate(...) {
              validate();
          }
        };
        return l;
     }
}

From your description, I assume that you want a validate-with-visual-feedback-on-document-change where the exact validation rule is the variable. If so, break it down into

  • a validation interface which checks a string value
  • a controller which uses that validation to decide if/how to decorate a given textComponent based on the validation result

some pseudo code

public interface TextPredicate {
     public boolean isValid(String text);
}

public class NotEmptyTextPredicate implements TextPredicate {
     // imlemented to return true/false for not/empty text
}

public class OnChangeValidator  {
     private TextPredicate predicate;
     private JTextComponent textComponent;
     private DocumentListener listener;

     public OnChangeValidator(JTextComponent component, TextPredicate predicate) {
          // assign and register the listener
          this.predicate = ....
          ...
          this.listener = create...
          component.getDocument().addDocumentListener(listener); 
     }

     protected void validate() {
         decorate(predicate.isValid(textComponent.getText())
     }

     protected void decorate(boolean valid) {
        if (valid) {
           // set normal visual properties
        } else {
          // set error visual properties
     }   


     protected DocumentListener createDocumentListener() {  
        DocumentListener l = new DocumentListener() {
          @Override
          public void insertUpdate(...) {
              validate();
          }

          @Override
          public void removeUpdate(...) {
              validate();
          }
        };
        return l;
     }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文