расширить функциональность addDocumentListener - PullRequest
2 голосов
/ 05 февраля 2012

У меня есть текстовое поле, которое расширяет 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 ИЛИ я должен пойти на слушателя фокуса?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2012

Исходя из вашего описания, я предполагаю, что вам нужно изменение с проверкой с визуальной обратной связью по документу, где точным правилом проверки является переменная.Если это так, разбейте его на

  • интерфейс проверки, который проверяет строковое значение
  • контроллер, который использует эту проверку, чтобы решить, следует ли / как украшать данный 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;
     }
}
3 голосов
/ 05 февраля 2012
  1. Нет необходимости расширять JTextField для того, что вы делаете. В большинстве случаев нет необходимости расширять компоненты Swing.
  2. То, что ваш слушатель делает в вашем MyTextField классе, выглядит очень похоже на то, что делает JFormattedTextField. Возможно, вы захотите использовать этот класс вместо
  3. Чтобы действительно ответить на ваш вопрос, вы можете расширить свой класс MyTextField и просто добавить еще один DocumentListener, который выполняет некоторые дополнительные проверки. Вы сохраните свою первоначальную функциональность, поскольку суперкласс добавит свой собственный DocumentListener
...