【发布时间】:2014-06-30 14:56:33
【问题描述】:
我在 JavaFX 应用程序中使用 ListView 控件。它设置为 MULTIPLE 选择模式。我知道作为用户,我可以按住 Ctrl 键单击一个项目来取消选择它,但这对我的用户来说不够直观。我想要一种方法来再次单击以取消选择它。换句话说,单击一次 - 选择;单击选定的项目,它会变为未选中。
我尝试过同时使用 ChangeListener 和 onMouseClicked 事件。两者都不是很好。下面是每个代码的sn-ps。
变更监听器:
效果 - 列表中的第一项从未被选中。我点击它,它保持未点击状态。对项目 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;
}
}
}
点击:
没有效果,因为我不确定如何获取我刚刚单击的索引。由于是硬编码,这根本不允许选择第 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);
}
}
});
【问题讨论】:
-
用户如何选择多个项目?
-
现在他们不知道他们可以用 Ctrl 键单击这是问题所在。我希望他们能够通过单击(无 Ctrl 键)来选择和取消选择。
-
使用“Ctrl + 单击”是许多 GUI Web/桌面应用程序的常见用户体验。您可以将其介绍给您的用户。或者,您可以将复选框放在列表单元格上,这可能更直观。
-
列表框上的复选框,天才。我怎么没想到!!!