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

时间:2020-05-02 11:35:46

标签: java swing jlist

我正在使用swing创建一个JList,可以显示和选择多个项目,也可以向其中添加一个新元素。但是,当我选择列表的第一个元素并在顶部添加一个新元素时,我得到了两个选择的元素(旧元素和新元素),但是当我将选择模式更改为单选效果很好,是否可以阻止这种自动选择,而只是使用多个间隔选择模式 保留旧选择的内容? 我使用了这个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);
}

3 个答案:

答案 0 :(得分:2)

我看到您基本上在问题中的link中复制了代码。该示例仅涉及在单击JList时向JButton添加单个元素的情况。它不处理JList选择。我认为该示例的作者没有考虑过用户在点击JList之前在JButton 中选择一个或多个元素时会发生什么。

我能够重现您的问题中描述的行为。在实现JListListSelectionModel时可能是一个错误。我解决的方法是向方法actionPerformed()中添加代码,以处理任何现有的JList选择。

这是我对方法actionPerformed()的修改版本。请注意,其余所有代码均未更改。首先,我保存所有选定行的索引。然后,我清除现有选择。然后,将新元素添加到JList中。现在,我需要重新选择在添加新元素之前选择的行。但是请注意,我需要将每个索引加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);
        }
    }
});

答案 1 :(得分:1)

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

ListSelectionModel.SINGLE_SELECTION-只能有一个列表索引 一次选择。在此模式下,setSelectionInterval和 addSelectionInterval是等效的,都替换了当前 带有第二个参数表示的索引的选择( “线索”)。

尝试jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

答案 2 :(得分:0)

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

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

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