2009-08-10 5 views
18

Je ai un modifiable JComboBox où je veux prendre une mesure à chaque fois que le texte est modifié, soit en tapant ou en sélectionnant. Dans ce cas, le texte est un motif et je veux vérifier que le motif est valide et montrer les correspondances qui résultent dans certaines données de test. Après avoir fait ce qui est évident, attacher un ActionHandler, j'ai trouvé que, pour la frappe, l'événement semble se déclencher de manière non fiable, au mieux (la sélection est correcte). Et quand fait feu à la suite de la frappe, le texte récupéré (en utilisant getEditor(). GetItem(), puisque getSelectedItem() obtient seulement le texte quand il a été sélectionné dans la liste) semble être le texte tel qu'il était lorsque le dernier événement a été déclenché - c'est-à-dire, il manque toujours le caractère a été tapé immédiatement avant que l'événement d'action ait été déclenché.Comment puis-je savoir quand le texte d'un JComboBox modifiable a été modifié?

Je m'attendais à ce que l'événement d'action se déclenche après un court délai (500ms à 1 seconde), mais il semble immédiatement déclenché lors de la frappe (s'il est déclenché du tout). La seule alternative réalisable que je peux penser est simplement de commencer une minuterie de 1 seconde sur le focus-gagné, le tuer sur focus-lost et faire le travail comme l'action de minuterie si le contenu est différent de la dernière fois.

Des idées ou des suggestions?

Les extraits de code ne sont pas particulièrement intéressants:

find.addActionListener(this); 
... 
public void actionPerformed(ActionEvent evt) { 
    System.out.println("Find: "+find.getEditor().getItem()); 
    } 

Répondre

30

L'auditeur d'action est généralement tiré seulement lorsque vous appuyez sur Entrée, ou déplacer le focus loin de l'éditeur du combobox. La bonne façon d'intercepter les changements individuels à l'éditeur est d'enregistrer un écouteur de document:

final JTextComponent tc = (JTextComponent) combo.getEditor().getEditorComponent(); 
tc.getDocument().addDocumentListener(this); 

Le DocumentListener interface a des méthodes qui sont appelées chaque fois que le document soutenant l'éditeur est modifié (insertUpdate, removeUpdate, changeUpdate).

Vous pouvez également utiliser une classe anonyme pour le contrôle plus fin où les événements viennent:

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 ... 
}); 
+0

Merci, je vais essayer. Cela ne me dérange pas Swing dans son ensemble, mais parfois travailler sur la façon d'obtenir un certain comportement ou de pièger certains événements est ** FAR ** de l'évidence. –

+0

OK, donc mettre de côté les "19" niveaux d'appel de méthode ... Après avoir ajouté un écouteur de document, quand l'événement se produit, je ne trouve aucun moyen de lier à laquelle des deux combo-boîtes ont été changées. À ce stade, une simple minuterie semble plutôt attrayante. –

+0

J'ai stocké le dernier texte connu pour les deux CB, et je l'utilise pour déterminer ce qui a changé lorsque l'événement de document est déclenché. Si vous savez comment relier l'événement au composant qui l'a déclenché, cela serait utile car un DocumentEvent n'est pas un événement AWT standard ou java.util.EventObject. –

0

Vous pouvez utiliser somthing comme ceci:

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 
     } 
    } 
}); 
-1

cela ressemble à la meilleure solution

jComboBox.getEditor().getEditorComponent().addKeyListener(new java.awt.event.KeyAdapter() { 
public void keyReleased(java.awt.event.KeyEvent evt) { //add your hadling code here: 

} }); 
+1

Cela manque les modifications effectuées sans utiliser le clavier (par exemple, coller ou supprimer du texte à l'aide du dispositif de pointage). – Martin

Questions connexes