我正在寻找一种方法,只需单击每个项目即可在 JList 中选择多个项目。
执行此操作的正常方法是按住 command/ctrl 键,然后单击。
我认为允许用户单击项目打开和关闭而不需要按住额外的键会更直观。
更改默认行为之前请三思。除非您有一些特殊的用例,否则我不希望我的列表与其他地方的工作方式不同:)
ListSelectionModel
:
list.setSelectionModel(new DefaultListSelectionModel() {
@Override
public void setSelectionInterval(int index0, int index1) {
if(super.isSelectedIndex(index0)) {
super.removeSelectionInterval(index0, index1);
}
else {
super.addSelectionInterval(index0, index1);
}
}
});
list.setSelectionModel(new DefaultListSelectionModel() {
private int i0 = -1;
private int i1 = -1;
public void setSelectionInterval(int index0, int index1) {
if(i0 == index0 && i1 == index1){
if(getValueIsAdjusting()){
setValueIsAdjusting(false);
setSelection(index0, index1);
}
}else{
i0 = index0;
i1 = index1;
setValueIsAdjusting(false);
setSelection(index0, index1);
}
}
private void setSelection(int index0, int index1){
if(super.isSelectedIndex(index0)) {
super.removeSelectionInterval(index0, index1);
}else {
super.addSelectionInterval(index0, index1);
}
}
});
我认为您可以通过在 JList 上附加鼠标侦听器并以编程方式选择侦听器代码中的项目来轻松完成此操作。当然,您可能需要一些代码来根据某些坐标确定按下了哪个项目。
Peter Lang 作品中接受的答案,但是,单击后移动鼠标时似乎有不可预测的行为。这可以通过设置一个在调整值时调用的布尔值来解决。
list.setSelectionModel(new DefaultListSelectionModel() {
private boolean gestureStarted = false;
@Override
public void setSelectionInterval(int index0, int index1) {
if (!gestureStarted) {
if (isSelectedIndex(index0)) {
super.removeSelectionInterval(index0, index1);
} else {
super.addSelectionInterval(index0, index1);
}
}
gestureStarted = true;
}
@Override
public void setValueIsAdjusting(boolean isAdjusting) {
if (!isAdjusting) {
gestureStarted = false;
}
super.setValueIsAdjusting(isAdjusting);
}
});
这将一次切换一个列表项。请注意,当您单击某个项目并在释放之前将鼠标拖出该项目时,该项目仍处于切换状态。