2012-01-21 11 views
8

Mam JComboBox, raz na sekundę chcę odzyskać zestaw ciągów z bazy danych i ustawić te łańcuchy na zawartość JComboBox, a jedną z nich jako aktualnie wybraną wartość. Ale chcę również, aby użytkownik mógł edytować JComboBox i dodać wartość do bazy danych i ustawić ją jako bieżącą wartość.Wykrywanie edycji JComboBox

Chcę być w stanie wykryć, kiedy znaki są wprowadzane do JComboBox, więc mogę zresetować odliczanie, co zapobiega aktualizacji JComboBox, o ile nie jest zero. Moim pierwszym odruchem było użyć KeyListener ale samouczek Java na polach kombi mówi to,

Chociaż JComboBox dziedziczy metody rejestrowania słuchaczy na imprezy niskopoziomowych - skoncentrować, klucz i zdarzenia myszy, na przykład - my zaleca się, aby nie słuchać zdarzeń o niskim poziomie w polu kombi.

I dalej twierdzą, że wydarzenie może się zmienić w zależności od wyglądu i stylu.

+0

Uwielbiam takie pytania. Swing jest interesującą strukturą, a jego właściwe użycie często zdarza się, że znamy serię dziwnych, ale wykonalnych hacków. :) –

Odpowiedz

4

Jest to trochę ryzykowne, ale powinno działać, aby wysłuchać aktualizacji dokumentu w komponencie edytora (A 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. 
      } 
     });          
    } 

te * Update (DocumentEvent DocumentEvent) metody powinny uzyskać wywołana dla każdego wprowadzonego znaku/usunięty z JComboBox.

2

Chciałbym dodać, że metoda changedUpdate nie uruchomi powiadomienia o dokumentach tekstowych. Jeśli używasz tekstowego komponentu tekstowego, musisz użyć funkcji insertUpdate i/lub removeUpdate.

Niedawno musiałem użyć detektora dokumentów jako sposobu wyłączania/włączania przycisku, jeśli użytkownik edytował pole kombi. Zrobiłem coś takiego i działa bardzo dobrze:

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

Następnie dodałem tego słuchacza do pola kombi jak ten:

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

To działa, ponieważ dokument związany z pola kombi jest zwykły tekst . Kiedy użyłem changeUpdate, nie było.