扩展addDocumentListener的功能

时间:2012-02-05 09:22:12

标签: java swing jtextfield documentlistener

我有一个扩展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));
                }
            }
        });
     }
}

现在我想要另一个文本字段说MyTextField1扩展MyTextField,它应该进行强制性检查,并在检查强制字段后给出DB中的一些信息,如果给出了一些值。我不想在其中编写相同的文档侦听器代码。是否可以扩展我在MyTextField中添加的文档侦听器,或者我应该选择焦点侦听器?

2 个答案:

答案 0 :(得分:3)

  1. 没有必要为您正在做的事情延长JTextField。大多数情况下,不需要扩展Swing组件。
  2. 您的MyTextField课程中您的听众所做的事情与JFormattedTextField的内容非常相似。您可能想要考虑使用该类
  3. 要真正回答您的问题,您可以扩展您的MyTextField课程,只需添加另一个DocumentListener进行额外检查。您将保留原始功能,因为超级类将添加自己的DocumentListener

答案 1 :(得分:3)

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

  • 检查字符串值的验证界面
  • 一个控制器,它使用该验证来决定是否/如何根据验证结果修饰给定的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;
     }
}
相关问题