2011-01-27 21 views
3

我想用JTextField實現自動跳過,但不知道最好的方式是做什麼。JTextField:當文本字段已滿/自動跳過/自動跳轉時關注下一個組件

什麼是autoskip/Auto-Tab?當您達到文本字段的定義長度限制時,您將自動進入下一個字段。 (比如按Tab鍵,關注下一個組件)或者你使用什麼名稱來表示這種行爲?

我嘗試這樣做:

JTextField.getDocument.addChangeListener():比較長度和尖位置。 似乎可用,但我無法區分類型的用戶輸入和呼叫JTextField.setText(String)

當gui-refresh更改文本時,焦點不應該改變。

您認爲最好的實現方式是什麼?

回答

1

請參閱Text Field Auto Tab

當gui-refresh更改文字時,不應改變焦點。

一)的removeListener
B)的setText
C)的addListener

編輯:

如果你真的不喜歡的需要的ChainDocumentFilter的概念,然後擺脫所有引用到那個班。如果需要,可以使用Toolkit.beep()替換provideErrorFeedback()方法調用。

3

也許你想add aKeyListener而不是組件。您仍然可以檢查長度和插入位置,但只有在按下/鍵入鍵時纔會觸發。

您的代碼可能類似於以下內容:

addKeyListener(new KeyAdapter(){ 
    public void keyTyped(KeyEvent e) { 
     if (getText().length() >= MAX_LENGTH) { 
      // Move the focus 
     } 
    } 
}); 

編輯迴應評論:
我可能會建議使用@ camickr的建議:

private DocumentListener myTabChangeListener; 
@Override 
public void setText(String text) { 
    getDocument().removeDocumentListener(myTabChangeListener); 
    super.setText(text); 
    getDocument().addDocumentListener(myTabChangeListener); 
} 
+0

這不能正常工作,因爲處理此keyTyped-Event時,文檔尚未更新。我可以在長度上添加「1」,但這不包括Paste-Actions(CTRL-V),其中長度已經是正確的。 – Synox 2011-01-28 09:57:04

+0

@Synox,看我的編輯。 – jjnguy 2011-01-28 13:39:15

0

在你的聽衆創建標誌isAPI來區分它是否是你的代碼調用setText()。在setText()調用之前將該標誌設置爲true,並在之後將其重置。

當它是真的什麼也不做,並在相反的情況下移動焦點。