java - obtener - jcombobox model
¿Cómo puedo saber cuándo se ha cambiado el texto de un JComboBox editable? (3)
El oyente de acción normalmente solo se activa cuando se pulsa Intro o se aleja del editor del cuadro combinado. La forma correcta de interceptar cambios individuales en el editor es registrar un detector de documentos:
final JTextComponent tc = (JTextComponent) combo.getEditor().getEditorComponent();
tc.getDocument().addDocumentListener(this);
La interfaz DocumentListener tiene métodos a los que se llama siempre que se modifica el documento que respalda al editor (insertUpdate, removeUpdate, changeUpdate).
También puede usar una clase anónima para un control más preciso de dónde provienen los eventos:
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 ...
});
Tengo un JComboBox editable en el que quiero realizar alguna acción cada vez que se cambia el texto, ya sea escribiendo o seleccionando. En este caso, el texto es un patrón y quiero verificar que el patrón sea válido y mostrar las coincidencias que resultan en algunos datos de prueba.
Habiendo hecho lo obvio, adjunte un ActionHandler, he encontrado que, para escribir, el evento parece dispararse de manera poco confiable, en el mejor de los casos (la selección está bien). Y cuando se dispara como resultado de la escritura, el texto recuperado (usando getEditor (). GetItem (), ya que getSelectedItem () solo obtiene el texto cuando se seleccionó de la lista) parece ser el texto tal como estaba el último evento se activó, es decir, siempre falta el carácter que se escribió inmediatamente antes de que se activara el evento de acción.
Esperaba que el evento de acción se disparara después de un breve retraso (500 ms a 1 segundo), pero parece que se disparó inmediatamente al teclear (si es que se dispara).
La única alternativa viable que se me ocurre es simplemente iniciar un temporizador de 1 segundo en enfoque ganado, eliminarlo en enfoque perdido y hacer el trabajo como acción del temporizador si el contenido es diferente al de la última vez.
¿Alguna idea o sugerencia?
Los fragmentos de código no son particularmente interesantes:
find.addActionListener(this);
...
public void actionPerformed(ActionEvent evt) {
System.out.println("Find: "+find.getEditor().getItem());
}
Esto suena como la mejor solución.
jComboBox.getEditor().getEditorComponent().addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) { //add your hadling code here:
} });
Puedes usar algo como esto:
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
}
}
});