2

我有一个扩展的文本字段,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它应该有这个强制检查,并且在检查强制字段之后从数据库中获取一些信息,如果给出了一些值。我不想在其中编写相同的文档侦听器代码。是否可以扩展我们添加的文档侦听器MyTextField或者我应该选择焦点侦听器?

4

2 回答 2

3

根据您的描述,我假设您想要一个 validate-with-visual-feedback-on-document-change,其中确切的验证规则是变量。如果是这样,将其分解为

  • 检查字符串值的验证接口
  • 一个控制器,它使用该验证来决定是否/如何根据验证结果装饰给定的 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;
     }
}
于 2012-02-05T11:13:32.300 回答
3
  1. 无需扩展JTextField您正在做的事情。大多数时候,不需要扩展 Swing 组件。
  2. 你的听众在MyTextField课堂上所做的看起来与 a 所做的非常相似JFormattedTextField。您可能要考虑使用该类
  3. 要真正回答您的问题,您可以扩展您的MyTextField课程并添加另一个DocumentListener进行一些额外检查的课程。您将保留原来的功能,因为超类将添加自己的DocumentListener
于 2012-02-05T09:48:51.987 回答