Java 在JList中选择多个项目,而不使用Ctrl/Command键

Java 在JList中选择多个项目,而不使用Ctrl/Command键,java,swing,user-interface,Java,Swing,User Interface,我正在寻找一种方法,只需单击每个项目,即可在JList中选择多个项目 通常的方法是按住command/ctrl键,然后单击 我认为更直观的做法是允许用户在不需要按住其他键的情况下打开和关闭项目。我认为您可以通过在JList上附加鼠标侦听器并在侦听器代码中以编程方式选择项目来轻松完成这一点。当然,您可能需要一些代码来根据某些坐标确定按下了哪个项目 更改默认行为之前请三思。除非您有一些特殊的用例,否则我不希望我的列表与其他地方不同:) 话虽如此,您应该能够使用自己的: 为此,您通常会使用一组复选框项

我正在寻找一种方法,只需单击每个项目,即可在JList中选择多个项目

通常的方法是按住command/ctrl键,然后单击


我认为更直观的做法是允许用户在不需要按住其他键的情况下打开和关闭项目。

我认为您可以通过在JList上附加鼠标侦听器并在侦听器代码中以编程方式选择项目来轻松完成这一点。当然,您可能需要一些代码来根据某些坐标确定按下了哪个项目

更改默认行为之前请三思。除非您有一些特殊的用例,否则我不希望我的列表与其他地方不同:)

话虽如此,您应该能够使用自己的:


为此,您通常会使用一组复选框项


用户已经习惯于按CTRL键在列表框中选择多个项目。您不应该更改默认体验/期望。

我的应用程序针对的是不懂电脑的人,所以我觉得我不需要使用标准(著名的最后一句话)。我从经验中发现,人们有时会忘记按住ctrl键并取消选择所有其他项目。我打算做一点可用性测试,看看人们喜欢什么。一个时髦的非标准应用程序的配方(比如Lotus Notes)…绝对有道理。我正在测试,没有文档/教程说您必须按Control来进行多重选择。。。正在测试并发现代码中没有问题+1.谢谢你的款待。我不认为这样做是正确的,但我想和几个人一起测试一下。这是可行的,但请注意列表中的任何ListSelectionListener都不会被通知。修复添加
fireValueChanged(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);
        }
    }
});
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);
        }
    }
});