Comment éviter de tir actionlistener cas de JComboBox lorsqu'un élément est ajouté dans cette dynamique en java?
J'ai besoin de vos suggestions et des conseils sur la tâche suivante.
J'ai un cadre qui a deux JComboBoxes censé ils sont nommés combo1 et combo2, une JTable et d'autres composants.
Lors de la première étape lorsque l'image est visible au-dessus du composant. Le combo1 zone de liste déroulante est rempli avec certaines valeurs, mais aucune valeur n'est sélectionnée à l'étape initiale, la combo2 zone de liste déroulante est désactivé et que la table est vide.
J'ai ajouté un actionListener sur combo1 ainsi que combo2. Il existe deux types de valeurs dans combo1 supposons que ces valeurs sont type1 et type2.
Condition 1:
Quand on sélectionne la valeur de type1 de Combo1 l'actionListener méthode est appelée de combo1 qui invoque une méthode qui combo2 reste désactivé et ajoute quelques lignes à la table liées à la valeur sélectionnée type1 de combo1.
Condition 2:
quand on sélectionne la valeur de type2 de combo1 l'actionListener méthode est appelée de combo1 qui invoque une méthode qui fait combo2 rempli avec certaines valeurs liées à la type2 et obtient activé mais aucune valeur n'est sélectionnée à partir de combo2 de table et également doit rester vide jusqu'à ce qu'on sélectionne une valeur de combo2.
table à chaque ajout de valeur à combo2 l'action de l'auditeur méthode de combo2 est obtient déclenché. Dans actionListener méthode de combo2 qui obtient combo2 valeur sélectionnée mais ici, il n'y a pas de valeur sélectionnée de la combo2 qui conduit à une NullPointerException.
Alors que dois-je faire pour que l'action listner méthode de combo2 ne sera pas exécutée après plus d'une valeurs de combo2.
OriginalL'auteur Param-Ganak | 2011-03-10
Vous devez vous connecter pour publier un commentaire.
Vous pouvez supprimer l'action de l'auditeur avant d'ajouter les nouveaux éléments, et l'ajouter une fois que vous avez terminé . Swing est mono-thread, donc il n'y a pas besoin de s'inquiéter sur les autres threads avoir à feu de l'auditeur.
Votre auditeur pourrait également vérifier si un élément est sélectionné et prendre les mesures appropriées si pas. Mieux que d'obtenir un NPE.
Merci "objets", la suppression de l'action de l'auditeur, la mise à jour de zone de liste déroulante, puis en ajoutant de l'action de l'écouteur en arrière, travaillé pour moi.
a travaillé pour moi aussi. - Je remplir un combobox avec des données provenant de la base de données. La DB requête est exécuté lorsque le premier élément est sélectionné ("Select moi de remplir la liste"). Si elle ne peut pas se connecter, la zone de l'arrière-plan est jauni et un message d'avertissement affiche au lieu de "me Sélectionner". 3 secondes plus tard, un événement de minuterie supprime le message d'avertissement et de revenir à ", Sélectionnez-moi". Avant cette solution, chaque fois qu'il allait revenir, il serait ré-essayer la requête, depuis le retour le message est considéré comme une
actionPerformed()
OriginalL'auteur objects
Ce que je fais au lieu de l'ajout et la suppression d'action auditeurs, j'ai une variable booléenne dans mon action auditeurs que c'est vrai si il doit permettre à l'action de grâce ou false si il a le bloquer.
Je puis le mettre à false quand je fais des changements d'incendie à l'action de l'auditeur
J'aime cette technique, mais une question. Après le réglage de
testActionListenerActive = false
, je puis "faire des trucs" qui va déclencher leActionListener
. Je suppose cela signifie qu'un appel à l'ActionListener
sera planifiée pour s'exécuter sur la Balançoire fil? Ensuite, j'ai mistestActionListenerActive = true
. Ainsi, à la question-comment puis-je savoir quetestActionListenerActive
sera toujours la valeur false lorsque laActionListener
(que j'ai envie de ne rien faire) fonctionne en fait? Merci.Ma réponse s'attend à ce que vous ne videz pas quoi que ce soit sur l'awt thread qui pourrait le feu de l'auditeur. Pour lutter contre ce problème, vous pouvez définir la testActionListenerActive de vrai avec une invoquer plus tard SwingUtilities.invokeLater(() -> testActionListenerActive = false); cette façon de tout ce qui pourrait avoir ajouté un évènement sur le l'awt thread ne sera pas encore appelé. Et seuls les événements qui sont ajoutés après votre = true tournoi sera traitée. Je vais mettre à jour ma réponse car c'est une préoccupation légitime.
Merci, je pensais à quelque chose le long de ces lignes.
Donc, j'ai eu tort de supposer que les appels à la
ActionListener
serait mis à la fin de la Balançoire événement file d'attente après mon code "fait un truc" à laJComboBox
. Je l'ai mis dans certains points d'arrêt et a remarqué que leActionListener
se déclenche immédiatement après "faire des trucs", bien avant la déclaration detestActionListenerActive
de vrai. Ainsi, votre code d'origine ont travaillé pour mon application depuis mon "faire des trucs" code était également en cours d'exécution sur la Balançoire fil. Mais, je préfère la version la plus récente.OriginalL'auteur LudgerP
bien que sa fin, une meilleure solution serait de désactivé la zone de liste déroulante à être modifiés avant d'être modifiés. en procédant ainsi, vous éviter de déclencher des événements de modification de la zone de liste déroulante quand, par exemple, vous utilisez des méthodes aime removeAllItems() ou addItem()
OriginalL'auteur johnny
Le moyen le plus propre est d'utiliser des expressions lambda comme ceci:
Pour la ci-dessus pour travailler, vous avez besoin de la méthode suivante défini quelque part:
OriginalL'auteur Saeid Nourian
Cela fonctionne:
Remarque: Vous ne pouvez pas simplement remplacer
setSelectedItem(...)
ousetSelectedIndex(...)
parce que ce sont aussi utilisés à l'interne lorsque des articles sont réellement choisis par l'utilisateur du clavier ou de la souris, lorsque vous ne voulez pas pour inhiber la cuisson de la des auditeurs.OriginalL'auteur Klaus Engelhardt
essayez ceci:
OriginalL'auteur slowbear
Pour déterminer si ou de ne pas effectuer de différentes méthodes de l'interface actionListener méthodes (actionPerformed() blocs de code) utilisation setActionCommand() sur les composants de source (combo1 ou combo2).
Pour votre exemple, avant d'ajouter des éléments à combo2 appel setActionCommand("ne rien faire") et de la garde de votre comboBoxActionPerformed() la méthode.
Voici un compilable exemple qui utilise ce principe pour avoir un combo set un autre combo de l'index sélectionné tout en affichant une Chaîne de caractères dans un component swing jtextfield. En utilisant setActionCommand() et gardant la comboActionPerformed() bloc de code, le component swing jtextfield défiler chaque mot dans le wordBank. Si le comboActionPerformed() la méthode n'était pas gardé ou si le actionCommand Chaîne n'a pas changé, 2 des actionevents déclenchera et le champ d'ignorer les mots.
OriginalL'auteur PianoKiddo
Je suis allé le stupide itinéraire simple à cette question pour mon programme car je suis nouveau en programmation.
J'ai changé l'action des auditeurs d'avoir un compteur si la déclaration:
if(stopActionlistenersFromFiringOnLoad != 0){//action performed ;}
Puis à la fin du programme java création, j'ajoute 1 au compteur:
topActionlistenersFromFiringOnLoad += 1;
OriginalL'auteur Lance Egan