我正在使用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);
}
答案 0 :(得分:2)
我看到您基本上在问题中的link中复制了代码。该示例仅涉及在单击JList
时向JButton
添加单个元素的情况。它不处理JList
选择。我认为该示例的作者没有考虑过用户在点击JList
之前在JButton
中选择一个或多个元素时会发生什么。
我能够重现您的问题中描述的行为。在实现JList
或ListSelectionModel
时可能是一个错误。我解决的方法是向方法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);
这应该按照您想要的方式工作!