2009-08-10 87 views
18

我有一個編輯的JComboBox,我想,通過輸入或選擇採取一些動作,當文字被改變。在這種情況下,文本是一種模式,我想驗證該模式是否有效,並顯示導致某些測試數據的匹配項。如何知道可編輯JComboBox的文本何時更改?

做完明顯,附加一個的ActionHandler,我發現,打字,事件似乎不可靠火,充其量(選擇是罰款)。而當它確實火打字的結果,文字檢索(使用getEditor()。getItem()時,因爲getSelectedItem()只得到,當它被從列表中選擇文本)似乎是文本,因爲它是當最後一個事件被觸發時 - 也就是說,它始終缺少在操作事件被觸發之前鍵入的字符。

我期待的動作事件的一些短暫的延遲(500毫秒到1秒)之後觸發,但似乎立刻在鍵控射擊(如果在所有的發射)。

我能想到的唯一可行的選擇是簡單地啓動焦點獲得的1秒定時器,在焦點丟失時將其消滅,並在內容與上次不同時執行定時器動作。

任何想法或建議?

的代碼片段是不是特別有趣:

find.addActionListener(this); 
... 
public void actionPerformed(ActionEvent evt) { 
    System.out.println("Find: "+find.getEditor().getItem()); 
    } 

回答

30

,當你按下回車鍵,或移動從ComboBox的編輯焦點離開動作監聽器通常僅被解僱。攔截到編輯器個別變化的正確的方法是註冊的文檔偵聽:

final JTextComponent tc = (JTextComponent) combo.getEditor().getEditorComponent(); 
tc.getDocument().addDocumentListener(this); 

DocumentListener interface具有每當文檔襯板編輯器被修改(中的insertUpdate,中的removeUpdate,changeUpdate)被調用的方法。

您也可以使用匿名類,事件的來源的細粒度控制:

final JTextComponent tcA = (JTextComponent) comboA.getEditor().getEditorComponent(); 
tcA.getDocument().addDocumentListener(new DocumentListener() { 
    ... code that uses comboA ... 
}); 

final JTextComponent tcB = (JTextComponent) comboB.getEditor().getEditorComponent(); 
tcB.getDocument().addDocumentListener(new DocumentListener() { 
    ... code that uses comboB ... 
}); 
+0

謝謝,我會試試看。我不介意Swing作爲一個整體,但有時候弄清楚如何獲得某些行爲或者捕捉某些事件是** FAR **顯而易見的。 – 2009-08-10 20:19:28

+0

好了,撇開方法調用的「19」的水平...具有所添加的文檔偵聽器,在事件發生時我能找到沒有辦法將比分扳成到兩個組合框被改變。在這一點上,一個簡單的計時器看起來非常有吸引力。 – 2009-08-11 05:27:55

+0

我存儲了兩個認證機構的最後一個已知文本,並使用它來確定文檔事件觸發時發生了哪些變化。如果您知道如何將事件綁定到觸發它的組件,這將是有用的信息 - 因爲DocumentEvent不是標準的AWT事件或java.util.EventObject。 – 2009-08-11 05:55:18

0

您可以使用財產以後這樣的:

JComboBox cbListText = new JComboBox(); 
cbListText.addItem("1"); 
cbListText.addItem("2"); 
cbListText.setEditable(true); 
final JTextField tfListText = (JTextField) cbListText.getEditor().getEditorComponent(); 
tfListText.addCaretListener(new CaretListener() { 
    private String lastText; 

    @Override 
    public void caretUpdate(CaretEvent e) { 
     String text = tfListText.getText(); 
     if (!text.equals(lastText)) { 
      lastText = text; 
      // HERE YOU CAN WRITE YOUR CODE 
     } 
    } 
}); 
-1

這聽起來像的最佳解決方案

jComboBox.getEditor().getEditorComponent().addKeyListener(new java.awt.event.KeyAdapter() { 
public void keyReleased(java.awt.event.KeyEvent evt) { //add your hadling code here: 

} }); 
+1

這會錯過不使用鍵盤所做的更改(例如,使用定位設備粘貼或刪除文本)。 – Martin 2017-08-01 10:59:46

相關問題