2012-01-21 70 views
8

我有一個JComboBox,每秒一次我想從數據庫中檢索一組字符串,並將這些字符串設置爲JComboBox的內容,並將其中一個字符串設置爲當前選定的值。但我也希望用戶能夠編輯JComboBox並向數據庫添加一個值並將其設置爲當前值。檢測JComboBox編輯

我希望能夠檢測何時將字符輸入到JComboBox中,因此我可以重置一個倒計數,從而防止更新JComboBox,只要它不爲零。我的第一反應是使用KeyListener的,但是,組合框的Java教程說這個,

雖然JComboBox中繼承的方法來註冊 低級事件監聽器 - 重點,關鍵,和鼠標事件,例如 - 我們 建議您不要偵聽組合框上的低級別事件。

然後他們繼續說,所發生的事件可能會根據外觀和感覺而改變。

+0

我喜歡這樣的問題。 Swing是一個有趣的框架,正確使用它往往不知道一系列奇怪的,但可行的,黑客。 :) –

回答

4

這是一個有點冒險,但它應該聽取編輯器組件(JTextField)上的文檔更新。

JComboBox cb = new JComboBox(); 
    Component editor = cb.getEditor().getEditorComponent(); 
    if (editor instanceof JTextField) { 
     ((JTextField) editor).getDocument().addDocumentListener(new DocumentListener() { 
      @Override 
      public void insertUpdate(DocumentEvent documentEvent) { 
       //To change body of implemented methods use File | Settings | File Templates. 
      } 

      @Override 
      public void removeUpdate(DocumentEvent documentEvent) { 
       //To change body of implemented methods use File | Settings | File Templates. 
      } 

      @Override 
      public void changedUpdate(DocumentEvent documentEvent) { 
       //To change body of implemented methods use File | Settings | File Templates. 
      } 
     });          
    } 

那些*更新(的DocumentEvent的DocumentEvent)方法應該得到呼籲/每個字符鍵入從JComboBox中刪除。

2

我想補充說changedUpdate方法不會觸發純文本文檔的通知。如果您使用純文本文本組件,則必須使用insertUpdate和/或removeUpdate。

如果用戶正在編輯組合框,最近我不得不使用文檔偵聽器來禁用/啓用按鈕。我做了這樣的事情和工作得非常好:

public class MyDocumentListener implements DocumentListener 
{ 

    @Override 
    public void insertUpdate(DocumentEvent e) 
    { 
    setChanged(); 
    notifyObservers(true); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) 
    { 
    setChanged(); 
    notifyObservers(false); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) 
    { 
    // Not used when document is plain text 
    } 
} 

然後,我添加了這個監聽到組合框是這樣的:

((JTextComponent) combobox.getEditor().getEditorComponent()) 
    .getDocument().addDocumentListener(new MyDocumentListener()); 

這工作,因爲與組合框相關聯的文檔是純文本。當我使用changedUpdate時,它沒有。