无需使用 Ctrl/Command 键即可选择 JList 中的多个项目

问题描述 投票:0回答:4

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

执行此操作的正常方法是按住 command/ctrl 键,然后单击。

我认为允许用户单击项目打开和关闭而不需要按住额外的键会更直观。

java swing user-interface
4个回答
15
投票

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

话虽如此,您应该可以使用自己的

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);
        }
    }
});

4
投票
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);
        }
    }
});

0
投票

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


0
投票

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);
    }
});

这将一次切换一个列表项。请注意,当您单击某个项目并在释放之前将鼠标拖出该项目时,该项目仍处于切换状态。

© www.soinside.com 2019 - 2024. All rights reserved.