自动选择 JList 顶部新添加的元素

new added element in the top of JList is automatically selected

我正在使用 swing 创建一个 JList,我可以显示和 select 多个项目,我也可以向它添加一个新元素。但是,当我 select 列表的第一个元素并将一个新元素添加到顶部时,我得到了两个 selected 元素(旧元素和新元素),但是当我更改 selection 模式到单个 selection 它工作正常,是否有可能阻止这种自动 selection 并且只是 keep旧的 selected 使用 多间隔 select 离子模式 ? 我使用了这个 link,其中包含一个使用 DataEventListner 的示例,但我没有成功找到解决方案。有什么帮助吗? 这是我的清单:

 public static void main(String args[]) {
    String labels[] = { "A", "B", "C", "D", "E", "F", "G", "H" };
    JFrame frame = new JFrame("Selecting JList");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final DefaultListModel model = new DefaultListModel();
    for (int i = 0, n = labels.length; i < n; i++) {
        model.addElement(labels[i]);
    }
    JList jlist = new JList(model);
    jlist.setSelectionMode(
            ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    JScrollPane scrollPane1 = new JScrollPane(jlist);
    frame.add(scrollPane1, BorderLayout.CENTER);
    JButton jb = new JButton("add F");
    jb.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent actionEvent) {
            model.add(0, "First");
        }
    });
    frame.add(jb,BorderLayout.SOUTH);
    frame.setSize(640, 300);
    frame.setVisible(true);
}

来自 JList#setSelectionMode(int) 的文档:

ListSelectionModel.SINGLE_SELECTION - Only one list index can be selected at a time. In this mode, setSelectionInterval and addSelectionInterval are equivalent, both replacing the current selection with the index represented by the second argument (the "lead").

尝试jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

我看到你基本上复制了你问题中 link 中的代码。该示例仅涉及在单击 JButton 时向 JList 添加单个元素。它不处理 JList selection[s]。我认为该示例的作者没有考虑当用户 select 在 JList 中的一个或多个元素在 单击 JButton.

我能够重现您问题中描述的行为。这可能是 JListListSelectionModel 实现中的错误。我修复它的方法是将代码添加到处理任何现有 JList select 离子的方法 actionPerformed()

这是我修改后的方法actionPerformed()。请注意,所有其余代码均未更改。首先,我保存所有 selected 行的索引。然后我清除现有的 select 离子。然后我将新元素添加到 JList。现在我需要重新 select 添加新元素之前 select 编辑的行。但请注意,我需要将每个索引递增 1,因为在索引 0(零)处有一个新元素。

jb.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent actionEvent) {
        int[] indices = jlist.getSelectedIndices();
        jlist.getSelectionModel().clearSelection();
        model.add(0, "First");
        for (int index : indices) {
            jlist.getSelectionModel().addSelectionInterval(index + 1, index + 1);
        }
    }
});

您可以在 jb.addActionListner() 中添加:

int x = jlist.getSelectedIndex();
    jlist.clearSelection();
    jlist.setSelectedIndex(x);

这应该会按照您想要的方式工作!