2012-02-05 87 views
2

的功能,我已經延伸javax.swing.JTextField,也有文檔偵聽這樣延長addDocumentListener

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添加或者我應該去爲焦點監聽文檔偵聽?

+0

作爲@Robin已經提到:沒有擴展JSomething,它們被設計爲,將被_used_。不,一個焦點偵聽器_永遠_(第一近似)是一個解決方案,它是太低的水平。 – kleopatra 2012-02-05 10:42:42

回答

3
  1. 無需爲您正在做的事情擴展JTextField。大多數情況下,不需要擴展Swing組件。
  2. 你的聽衆確實在MyTextField類看起來非常相似什麼JFormattedTextField一樣。你可能要考慮使用類,而不是
  3. 要真正回答你的問題,你可以擴展你的MyTextField類,並添加另一DocumentListener,做一些額外的檢查。你會保留原來的功能,因爲超類將增加自己的DocumentListener
+0

爲先,挑剔的人全ACK:2)AFAIR,格式化文本字段不改變邊界;-) 3)技術上是正確的,但不推薦(通過繼承層次堆砌的聽衆可以有奇怪的干擾效應) – kleopatra 2012-02-05 10:37:14

+0

@kleopatra我想每個Swing程序員在他/她的阿森納這提高了用戶的反饋具有JFormattedTextField上的改進版本 – Robin 2012-02-05 11:42:15

3

從你的描述,我假設你想驗證與 - 視覺反饋的文檔變化,其確切的驗證規則變量。如果是的話,把它分解成

  • 驗證界面,檢查一個字符串值
  • 它使用驗證,以決定是否/如何根據驗證結果裝點給定Choice上的控制器

一些僞代碼

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; 
    } 
}