【问题标题】:How to set multiple items as selected in JList using setSelectedValue?如何使用 setSelectedValue 在 JList 中设置多个项目?
【发布时间】:2011-08-23 02:40:57
【问题描述】:

我有一个 jList,它通过添加到底层 listModel 来动态填充。现在,如果我有三个我知道并且我知道其值的字符串

for(i=0;i<3;i++){
    jList.setSelectedValue(obj[i],true);//true is for shouldScroll or not
}

似乎只选择了最后一个项目...如果无法做到这一点,我必须从底层模型中设置选择,我应该怎么做???

另外请注意 jList 有选择模式:

  jList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

提前致谢

【问题讨论】:

    标签: java swing selection jlist


    【解决方案1】:
    jList.addSelectionInterval(0,2);
    

    【讨论】:

    • +1 与addSelectionInterval 一致,但为了成为真正有用的答案,需要进行解释。
    【解决方案2】:

    虽然StanislasV answer 完全有效,但我宁愿避免将一个选择间隔添加到另一个选择间隔。相反,您应该更喜欢像这样调用JList 关联的ListSelectionModel#setSelectionInterval(int, int) 方法:

    jList.getSelectionModel().setSelectionInterval(0, 3)
    

    如果您希望您的列表选择不相交,您还必须编写自己的ListSelectionModel

    【讨论】:

    • -1 这完全是错误的 - addSelectionInterval 是 方法,旨在......好吧......向选择添加一些东西。确切的结果取决于 SelectionMode
    【解决方案3】:

    请注意,所有 xxSelectedValue 方法都是围绕 JList 上的 selectionModel(仅支持基于索引的选择访问)的便捷包装方法。不支持设置多个选择每个值。如果你真的想要它,你必须自己实现一个方便的方法。基本上,您必须遍历模型的元素,直到找到相应的索引并调用基于索引的方法,例如:

    public void setSelectedValues(JList list, Object... values) {
        list.clearSelection();
        for (Object value : values) {
            int index = getIndex(list.getModel(), value);
            if (index >=0) {
                list.addSelectionInterval(index, index);
            }
        }
        list.ensureIndexIsVisible(list.getSelectedIndex());
    }
    
    public int getIndex(ListModel model, Object value) {
        if (value == null) return -1;
        if (model instanceof DefaultListModel) {
            return ((DefaultListModel) model).indexOf(value);
        }
        for (int i = 0; i < model.getSize(); i++) {
            if (value.equals(model.getElementAt(i))) return i;
        }
        return -1;
    }
    

    【讨论】:

    • +1 addSelectionInterval 可以解决问题。这应该是公认的接受!!!! :D
    • 请记住 DefaultListModel.indexOf(value) 已经进行了线性搜索,因此使用 indexOf 与 for 版本相同(效率相同,但可读性更高)。
    • @PhoneixS 这是一个我们不知道的实现细节:)
    • 我们真的可以知道,至少对于 oracle 和 OpenJDK,我们可以看到源代码(就像我所做的那样)。这是开源的好处:D
    • @PhoneixS 是的,我们可以阅读 - 但我们不能确定,因为实现不是规范的一部分,可能会在没有通知的情况下更改:) 不要依赖实现细节,永远不要- 永远...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2011-09-30
    • 2016-03-23
    相关资源
    最近更新 更多