2010-12-09 40 views
4

Je cherche un écouteur qui se déclenche UNIQUEMENT lorsque l'utilisateur, celui qui utilise le programme, sélectionne un élément dans le JComboBox. Je ne veux pas utiliser ActionListener ou ItemListener car ceux-ci se déclenchent également lorsque je sélectionne un élément dans le programme. Et je ne peux pas utiliser MouseListener soit parce qu'il ne se déclenche que lorsque je clique sur le JComboBox, et non lorsque je sélectionne un élément.Comment faire un écouteur qui se déclenche lorsque l'utilisateur sélectionne un élément dans un JComboBox

Je me demandais quelle est la meilleure façon de faire cela? Actuellement, ma solution est désordonnée. Lorsque je modifie l'élément sélectionné de jcombobox via le code, je définis un indicateur sur true. Et dans mon écouteur d'action, il s'exécute seulement si le drapeau est faux.

+0

Lorsque je modifie l'élément sélectionné de jcombobox via le code, je définis un indicateur sur true. Et dans mon écouteur d'action, il s'exécute seulement si le drapeau est faux. - J'ai dû le faire dans plusieurs cas, j'aime aussi savoir une manière moins brutale de résoudre ce problème. –

Répondre

1

A) Je vous recommande de supprimer temporairement l'écouteur lorsque vous effectuez la sélection par programmation. B) Si votre changement de programme n'est pas un effet d'un autre événement de l'interface graphique, vous pouvez le résoudre de la manière laide/non robuste/sujette aux erreurs/hacky: Vérifiez EventQueue.isEventDispatchThread() pour savoir si le clic a été déclenché par le thread graphique (l'utilisateur).

C) (Oops je relis simplement votre question et vu que vous avez déjà découvert la méthode décrite ci-dessous. En fait, je dirais que ce (ou la méthode décrite ci-dessus) est la meilleure alternative.)

Une autre option consiste à avoir un indicateur booléen appelé quelque chose comme nonUserSelection que vous définissez à true avant de sélectionner une valeur par programme et de la réinitialiser à false par la suite. Dans l'écouteur d'actions, vous ajoutez simplement un

if (nonUserSelection) 
    return; 
+0

C'est un effet d'un autre événement de l'interface graphique. Ce que je fais est d'avoir 2 comboboxes placés l'un par l'autre. Lorsque l'utilisateur sélectionne quelque chose dans le premier, il est sélectionné dans le second sauf si l'utilisateur a déjà sélectionné quelque chose dans celui-là. – fent