Exécuter une action lorsqu'un élément dans la zone de liste déroulante est sélectionné
J'ai un jcombobox contenant item1 et item2, aussi, j'ai un component swing jtextfield.. lorsque je sélectionne item1 sur mon jcombobox je veux 30 à apparaître sur mon component swing jtextfield, tandis que 40 si Item2 a été sélectionné... Comment dois-je faire?
OriginalL'auteur mitche027 | 2013-03-02
Vous devez vous connecter pour publier un commentaire.
c'est comment vous le faites avec ActionLIstener
OriginalL'auteur secario
La solution la plus simple serait d'utiliser un
ItemListener
. Lorsque les changements d'état, il vous suffit de vérifier l'élément actuellement sélectionné et mis le texte en conséquenceUne meilleure solution serait de créer un objet personnalisé qui représente la valeur affichée et la valeur associée avec elle...
Mis à jour
Maintenant je n'ai plus de 10 mois à mâcher sur mes chevilles, j'ai mis à jour l'exemple d'utiliser un
ListCellRenderer
qui est un plus bonne façon de procéder ensuite été paresseux et dominantetoString
wrapper objets avec substituée toString (au lieu d'un bon moteur de rendu) sont mal - ici, il pourrait apparaître comme à mi-chemin justifyable parce que vous semblez avoir besoin d'une autre propriété pour anothe vue ... ce qui est un home-grown problème, parce que la prise en compte de l'objet métier est mal, pour commencer: l'Élément lui-même pourrait être l'objet de l'entreprise, et de ses toString remplacé par une description complète à la place de quelque chose de pertinent d'un point de vue particulier 😉
Je suis totalement d'accord, c'était un fast cut en raison d'une quantité limitée de temps pour réellement code (pas d'excuse), les mauvaises moi
N'oubliez pas d'inclure le KeySelectionManager donc les éléments dans la liste déroulante peut être sélectionné par la touche. Dès que vous utilisez un moteur de rendu personnalisé vous casser la fonctionnalité par défaut de la liste déroulante.
Je pense que chaque application est différente. L'utilisation d'une cellule de rendu dans ce cas (du point de vue de l'OP) PEUT-être exagéré (difficile à déterminer à partir de la question), mais en utilisant un objet personnalisé, nous nous marions le texte/vue de la représentation et de ses associés de la valeur, il est plus facile d'ajouter, de modifier & supprimer des éléments. Je suis également d'accord avec kleo, toString devrait être utilisé pour fournir stateful des informations sur l'objet et les moteurs de rendu doit être utilisé pour le format de l'objet pour l'affichage. Il est peu probable que vous nous la Date#toString valeur pour rendre les dates de tous les temps
OriginalL'auteur MadProgrammer
Pas une réponse à la question d'origine, mais un exemple de la façon de les rendre réutilisables et de travail personnalisé convertisseurs sans casser MVC 🙂
Il est mal dans un MVC environnement, parce que c'est un mélange de données et afficher: maintenant, le modèle ne contient pas de données mais une surcouche qui est introduit pour vue raisons. C'est la rupture de la séparation des préoccupations et de l'encapsulation (chaque classe d'interagir avec le modèle doit être conscient de la enveloppé de données).
La conduite des forces pour briser les règles sont:
Comme dans Swing personnalisé rendu est la petite pièce de monnaie conçu pour accueillir personnalisées de la représentation visuelle, par défaut un gestionnaire qui ne peuvent pas faire face est ... cassé. Peaufiner la conception juste pour accueillir une telle merde par défaut est dans le mauvais sens, sorte de haut en bas. Le bon est, de mettre en œuvre une adaptation manager.
Tout en ré-utilisation est bien, le faire au prix de la rupture de l'architecture de base n'est pas une bonne bargin.
Nous avons un problème dans la présentation domaine, nous allons le résoudre dans la présentation domaine avec les éléments conçus pour résoudre exactement le problème. Comme vous l'avez deviné, SwingX dispose déjà d'une telle solution 🙂
Dans SwingX, le fournisseur d'une représentation de chaîne est appelé StringValue, et par défaut tous les convertisseurs de prendre une telle StringValue pour configurer eux-mêmes:
Comme le defaultRenderer est-StringValue (mise en œuvre de déléguer à la donnée), une sage mise en œuvre de KeySelectionManager maintenant peut déléguer au moteur de rendu de trouver l'élément approprié:
Décrit l'approche, car il est facilement réalisable, même sans l'aide de SwingX, il vous suffit de définir de mettre en œuvre quelque chose de semblable et de l'utiliser:
Tous sauf la chaîne de fournisseur est réutilisable en l'état (qui est exactement une mise en oeuvre de la coutume moteur de rendu et la keySelectionManager). Il peut être générale, les implémentations de la chaîne de fournisseur de f.j'. ceux qui mise en forme de la valeur ou de l'utilisation des propriétés du bean via la réflexion. Et le tout sans casser des règles de base 🙂
Il y a un beaucoup d'utilisations pour une valeur/description paires. Par exemple, un Produit. "1" est un Marteau (à me frapper sur la tête avec), "2" est un Tournevis. Quelque part vous avez besoin de garder cette cartographie de la valeur/description. Donc, pour dire qu'un Objet ne peut pas avoir ces deux propriétés de l'ensemble n'a pas de sens pour moi. Maintenant que ces deux propriétés sont ensemble dans une classe, vous pouvez choisir les propriétés que vous souhaitez afficher dans la liste déroulante en utilisant le moteur de rendu.
Aussi, les chances sont que votre produit aura de multiples descriptions de langues différentes. Ainsi, lorsque vous remplissez la classe de l'Élément vous permettra de le remplir avec la description appropriée directement à partir de votre Base de données ou un fichier de ressources ou tout ce que vous utilisez.
on mélange les préoccupations de nouveau et il me semble maintenant que vous le faites exprès. Si vous ne voulez pas suivre MVC, c'est ce que vous ne voulez pas et je ne vais pas discuter de ça 🙂 il suffit de répéter: La valeur (== haricot, ayant des propriétés arbitraires) appartient lui-même dans l' (Swing) données domaine, inchangée pour afficher les raisons. La représentation de chaîne dans la zone de liste déroulante est un problème de l' (Swing) vue du royaume, afin de résoudre les il y, f.j'. en tenant compte de la production de la chaîne de caractères à utiliser dans une classe qui ne fait rien d'autre.
Je ne suis pas le faire intentionnellement. Je ne suis pas toujours le meilleur résumé penseur et parfois besoin d'exemples concrets. Je n'ai toujours aucune idée de comment l'utiliser à votre StringValue classe. En ce qui concerne MVC. Honnêtement, je ne vois pas le problème avec le fait d'avoir de la valeur et la description de la classe qui est ajouté au Modèle (par exemple. la valeur représente un "id de produit" et la description est la description du produit). Ensuite, vous pouvez avoir des vues personnalisées, l'un des produits de la description.
OriginalL'auteur kleopatra