JList - désélectionner en cliquant déjà un élément sélectionné
Si un index sur une JList est cliqué, je veux qu'il dé-sélectionner. En d'autres termes, en cliquant sur les indices de la réalité bascule de leur sélection. N'a pas l'air comme cela a été pris en charge, j'ai donc essayé
list.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
java.awt.Point point = evt.getPoint();
int index = list.locationToIndex(point);
if (list.isSelectedIndex(index))
list.removeSelectionInterval(index, index);
}
});
Le problème ici est que c'est invoquée après JList a déjà agi sur l'événement de la souris, de sorte qu'il permet de désélectionner tout. Alors j'ai essayé de supprimer tous JList est MouseListeners, ajoutant ma propre, puis ajouter la totalité de la valeur par défaut auditeurs de retour. Cela ne fonctionne pas, depuis JList serait de sélectionner à nouveau l'index après que je l'ai désactivée. De toute façon, ce que j'ai finalement venu avec est
MouseListener[] mls = list.getMouseListeners();
for (MouseListener ml : mls)
list.removeMouseListener(ml);
list.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
java.awt.Point point = evt.getPoint();
final int index = list.locationToIndex(point);
if (list.isSelectedIndex(index))
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
list.removeSelectionInterval(index, index);
}
});
}
});
for (MouseListener ml : mls)
list.addMouseListener(ml);
... et qui fonctionne. Mais je ne l'aime pas. Est-il un meilleur moyen?
MouseAdapter
. Si il y a une solution plus élégante, je serais ravi d'entendre parler de lui, trop.C'est pris en charge par défaut dans la JList, mais vous avez maintenant la touche Ctrl enfoncée (au moins sous Windows) sur un élément sélectionné dans l'ordre pour le désélectionner.
OriginalL'auteur Pete | 2010-03-27
Vous devez vous connecter pour publier un commentaire.
Regardant l'Exemple de "ListSelectionModel: l'Activation de Basculer le Mode de Sélection" ici:
http://java.sun.com/products/jfc/tsc/tech_topics/jlist_1/jlist.html
J'ai modifié légèrement pour sélectionner plusieurs zones de liste (modifié setSelectionInterval à addSelectionInterval) et éliminé un problème avec la re-sélection si vous cliquez sur afin de sélectionner et de déplacer votre souris de la souris est enfoncée (déplacé le gestureStarted case pour ajouter et supprimer).
OriginalL'auteur FuryComputers
Comment à ce sujet?
Il fonctionne, mais note un effet secondaire... Si vous réglez le mode de la multi sélection comme ceci par exemple:
vous ne pouvez pas sélectionner plusieurs objets à l'aide de la souris, faites glisser. La touche Ctrl (ou maj) cliquez sur les œuvres. Je suis sûr qu'il peut être fixé, mais je suppose que vous avez demandé ce pour de simples listes de sélection... Si ce n'est de modifier votre question et nous pouvons commencer à penser à des solutions pour la sélection multiple problème.
OriginalL'auteur Savvas Dalkitsis
Je sais que cette question a déjà accepté de répondre, mais j'ai pensé que je voudrais développer un peu plus, car je me suis retrouvé coincé sur cette tâche pour quelques heures.
J'essayais de mettre en œuvre un clic-désélectionnez l'action de certains articles, mais ma liste de mise en œuvre requiert l'utilisation de mode de Sélection, spécifié par
Malheureusement, cela a conduit à des exceptions et des appels redondants pour de nombreuses solutions pour le click-to-désélectionner problème sur de nombreuses questions, y compris cette réponse par FuryComptuers ci-dessus. En raison de code dans
DefaultListSelectionModel.class
, en particulier dans leaddSelectionInterval(int index0, int index1)
etremoveSelectionInterval(int index0, int index1)
méthodes, qui appelle de nouveau à lasetSelectionInterval(int index0, int index1)
méthode, a provoqué une circulaire d'appel qui conduit à (évidemment) des exceptions. Ce "problème" code peut être vu ci-dessous.Sawas Dalkitsis' réponse résolu ce problème, mais ce serait encore agir bizarre lorsque vous faites glisser la souris sur un élément (l'élément sélectionné sera de choisir et de sélectionner lui-même de plus et plus tout en faisant glisser la souris). Ce ne semble pas être un problème, mais (apparemment) j'ai des tremblements dans la main et les petits mouvements de la souris tout cliqué abouti à un comportement non désiré. J'ai combiné Sawas Dalkitsis réponse et FuryComptuers's réponse pour obtenir le code suivant, qui semble fonctionner comme vous le souhaitez:
Remarque: je n'ai pas vérifier par rapport à la
ListSelectionModel.SINGLE_INTERVAL_SELECTION
, comme Sawas Dalkitsis fait, donc faites attention si vous la mettre en œuvre dans ce cas.OriginalL'auteur shawmanz32na
Vous pouvez toujours les ListSelectionListener au lieu de déchiffrer le point cliqué et puis le traduire à l'élément sélectionné.
http://java.sun.com/docs/books/tutorial/uiswing/examples/events/index.html#ListSelectionDemo
http://java.sun.com/docs/books/tutorial/uiswing/events/listselectionlistener.html
http://java.sun.com/docs/books/tutorial/uiswing/examples/events/ListSelectionDemoProject/src/events/ListSelectionDemo.java
Dans le lien ci-dessus pour le fichier java il y a une mise en œuvre qui peut être facilement améliorée à faire "désélection" 🙂
ListSelectionListener.valueChanged
ne sera pas appelé, depuis la sélection n'est pas changé. Si vous ne pouvez pas désélectionner la déjà à l'élément sélectionné à l'intérieur de cette méthode.OriginalL'auteur Kannan Ekanath
J'ai étendu FuryComptuers réponse à l'appui de sélection multiple, et correction d'un problème où
setSelectionInterval
ne fonctionne pas si il a été appelé directement.OriginalL'auteur Nick Dandoulakis
Nick Dandoulakis réponse n'a pas assez de travail pour moi lors de la sélection de plusieurs éléments à la fois à l'aide d'un clic de souris tout en appuyant sur Maj.
Suivantes
ListSelectionModel
se comporte comme je m'attends au moment de la sélection des éléments à l'aide mouseclicks avec Maj ou Ctrl.Aussi, maintenez Maj + Ctrl et appuyer sur → ou ← sélectionne les éléments de la façon dont je le veux.
OriginalL'auteur Matthias Braun