2012-01-21 2 views
8

Possiedo un JComboBox, una volta al secondo voglio recuperare un set di stringhe da un database e impostare tali stringhe sul contenuto di JComboBox e una di esse come valore attualmente selezionato. Ma voglio anche che l'utente sia in grado di modificare JComboBox e aggiungere un valore al database e impostarlo come valore corrente.Rilevamento della modifica di JComboBox

Desidero essere in grado di rilevare quando i caratteri vengono immessi in JComboBox, quindi posso reimpostare un conto alla rovescia che impedisce l'aggiornamento di JComboBox finché non è zero. Il mio primo istinto è stato quello di utilizzare un KeyListener ma il tutorial Java su caselle combinate dice che questo,

Anche se JComboBox eredita metodi per registrare gli ascoltatori per gli eventi di basso livello - messa a fuoco, la chiave e gli eventi del mouse, per esempio - ci consiglia di non ascoltare eventi di basso livello in una casella combinata.

E proseguono dicendo che gli eventi sparati possono cambiare a seconda dell'aspetto.

+0

Amo domande come questa. Swing è un framework interessante e usarlo correttamente è più frequente che non conoscere una serie di hack bizzarri, ma fattibili. :) –

risposta

4

Questo è un po 'rischioso, ma dovrebbe funzionare per ascoltare gli aggiornamenti del documento sul componente Editor (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. 
      } 
     });          
    } 

Quei * Update (DocumentEvent DocumentEvent) metodi dovrebbe ottenere chiamato per ogni carattere digitato/eliminato dalla JComboBox.

2

Vorrei aggiungere che il metodo changedUpdate non genererà una notifica per i documenti di solo testo. Se si utilizza un componente di testo semplice, è necessario utilizzare insertUpdate e/o removeUpdate.

Recentemente ho dovuto utilizzare un listener di documenti come un modo di disabilitare/abilitare un pulsante se l'utente stava modificando la casella combinata. Ho fatto qualcosa di simile e ha lavorato molto bene:

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

Poi, ho aggiunto questo listener alla casella combinata in questo modo:

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

Questo funziona perché il documento associato alla casella combinata è testo normale . Quando ho usato changedUpdate non lo ha fatto.