2012-01-21 19 views
8

Tengo un JComboBox, una vez por segundo quiero recuperar un conjunto de cadenas de una base de datos y establecer esas cadenas para el contenido de JComboBox, y una de ellas como el valor seleccionado actualmente. Pero también quiero que el usuario pueda editar el JComboBox y agregar un valor a la base de datos y establecerlo como el valor actual.Detectando la edición de JComboBox

Quiero poder detectar cuando los caracteres se ingresan en el JComboBox, por lo que puedo restablecer un conteo regresivo que impide actualizar el JComboBox siempre que no sea cero. Mi primer impulso fue utilizar un KeyListener pero el tutorial de Java en los cuadros combinados dice esto,

Aunque JComboBox hereda métodos para registrar detectores de eventos de de nivel bajo - foco, llave, y eventos de ratón, por ejemplo - nos recomendamos que no escuche los eventos de bajo nivel en un cuadro combinado.

Y continúan diciendo que los eventos activados pueden cambiar según la apariencia.

+0

Me encantan las preguntas como esta. Swing es un marco interesante y usarlo correctamente es más a menudo que no conocer una serie de hacks raros, pero viables. :) –

Respuesta

4

Esto es un poco arriesgado, pero debería funcionar para escuchar las actualizaciones del documento en el 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. 
      } 
     });          
    } 

Esas * Actualización (DocumentEvent DocumentEvent) métodos deberían ser llamado para cada carácter escrito/borrado de la JComboBox.

2

Me gustaría agregar que el método changedUpdate no activará una notificación para documentos de texto sin formato. Si está utilizando un componente de texto sin formato, debe usar insertUpdate y/o removeUpdate.

Recientemente tuve que usar un detector de documentos como una forma de deshabilitar/habilitar un botón si el usuario estaba editando el cuadro combinado. Hice algo como esto y funcionó muy bien:

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

Luego, añadí este escucha al cuadro combinado de esta manera:

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

Esto funciona porque el documento asociado con el cuadro combinado es texto sin formato . Cuando utilicé changedUpdate no fue así.