Désélectionner un élément sur un javafx ListView sur cliquez sur
Je suis en utilisant un contrôle ListView dans un JavaFX application. Il est réglé pour le mode à sélection MULTIPLE. Je sais en tant qu'utilisateur, je peux Ctrl-Cliquez sur un élément pour le désélectionner, mais ce n'est pas assez intuitif pour mes utilisateurs. Je veux un moyen de cliquez une deuxième fois pour le désélectionner. En d'autres termes, cliquez une fois sélectionner, cliquez sur l'élément sélectionné et il devient non sélectionnés.
J'ai essayé d'utiliser à la fois un ChangeListener et un onMouseClicked événement. Ni fonctionne très bien. Ci-dessous sont extraits de code de chacun.
ChangeListener:
effet - premier élément de la liste n'est JAMAIS sélectionné. Je clique dessus et il reste unclicked. Aucun effet sur les points 2..n
listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<SpecificAlgorithmData>() {
@Override
public void changed(final ObservableValue observableValue, final SpecificAlgorithmData oldData, final SpecificAlgorithmData newData) {
//if already selected then deselect it
int selectedIndex = listView.getSelectionModel().getSelectedIndex();
System.out.println("selected " + selectedIndex);
System.out.println("all selected" + listView.getSelectionModel().getSelectedIndices());
if (!selecting && !listView.getSelectionModel().getSelectedIndices().contains(selectedIndex)){
Iterator <Integer> iterator = listView.getSelectionModel().getSelectedIndices().iterator();
selecting = true;
listView.getSelectionModel().select(-1);//deselect all
while (iterator.hasNext()){
int index = iterator.next();
if (index!= selectedIndex){
listView.getSelectionModel().select(index);
}
}
selecting = false;
}
}
}
onClick:
Aucun effet, car je ne suis pas sûr de savoir comment obtenir l'index de celui que j'ai juste cliqué. Étant codé en dur, ce tout simplement interdit de jamais la sélection de l'élément 2.
listView.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(final MouseEvent mouseEvent) {
int selectedItem = 2; //FIXME: How to I get the index of clicked item?
if (listView.getSelectionModel().isSelected(selectedItem)){
listView.getSelectionModel().clearSelection(selectedItem);
}
}
});
Pour l'heure, ils ne savent pas qu'ils peuvent avec Ctrl-clic qui est le problème. Je voudrais qu'ils soient en mesure de sélectionner et de désélectionner d'un simple clic (pas de touche Ctrl).
Utilisation de la touche "Ctrl + Clic" est une commune expérience de l'utilisateur sur l'interface graphique Web/applications de Bureau. Vous pouvez bien vouloir présenter ce à vos utilisateurs. Sinon, vous pouvez mettre des cases à cocher sur la liste des cellules, ce qui pourrait être plus intuitive.
Des cases à cocher sur la liste des boîtes, génie. Pourquoi n'ai-je pas pensé!!!
OriginalL'auteur Domenic D. | 2014-05-13
Vous devez vous connecter pour publier un commentaire.
De changer le comportement des contrôles dans JavaFX est assez difficile - il n'y a vraiment pas de crochets actuellement dans l'API dans les classes de comportement.
La suite semble fonctionner, par l'enregistrement d'un filtre d'événement avec des cellules dans la liste, la mise en œuvre de la sélection du comportement directement, et de consommer de l'événement.
Il se sent un peu fragile si (si une version future décidé de mettre en œuvre le comportement par défaut de la souris est cliqué, la place de la souris enfoncé, par exemple; ou peut-être mieux, si une future version décidé d'ajouter des fonctionnalités supplémentaires gérés par les événements de la souris). Afin d'utiliser cette solution avec un peu de l'acheteur l'avis ci-joint.
Évidemment, vous savez que vos utilisateurs mieux que moi, mais je pourrais préfèrent juste pour avoir une belle bulle d'aide sur le
ListView
en leur expliquant comment l'utiliser...Oui... les cases à cocher sont probablement une meilleure façon d'aller. C'est aussi évident que vous pouvez faire pour vos utilisateurs ;).
Nice! Le requestFocus(); fait le tour. Je suis "aller de l'avant" par l'intermédiaire d'un couple de listes -> lorsque l'utilisateur modifie son choix (il) et sélectionne une liste précédente (comme naviguer vers l'arrière), la sélection, ce qui les maintient dans un état inactif devrait être invalide/levée (inactif, le choix de l'interface graphique incorrect). Merci!
J'ai eu quelques problèmes avec cette solution comme le premier élément est toujours sélectionné après de la désélection d'un objet. Toutefois, une solution de contournement peut être trouvé ici.
OriginalL'auteur James_D