英文:
new added element in the top of JList is automatically selected
问题
创建一个使用Swing的JList,我可以显示和选择多个项目,还可以添加新元素。然而,当我选择列表的第一个元素并在顶部添加一个新元素时,我得到了两个选定的元素(旧的和新的)。但是,当我将选择模式更改为单选时,它正常工作。是否可能阻止这种自动选择,只需在多区间选择模式下保持旧的选定状态?我使用了这个链接,其中包含使用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);
}
英文:
I am creating a JList using swing, I can display and select multiple items, also I can add a new element to it. However, when I select the first element of the list and add a new one to the top, I got two selected elements (the old one and the new one), but when I change the selection mode to single selection it works fine, is it possible to prevent this automatic selection and just keep the old one selected using multiple interval selection mode?
I used this link that contain an example using DataEventListner but I did not succeed to find a solution. Any help please?
Here is my list:
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);
}
答案1
得分: 2
我看到你基本上复制了你问题中的链接中的代码。那个示例仅涉及在单击“JButton”时向JList
添加单个元素。它没有处理JList
选择。我认为那个示例的作者没有考虑用户在单击“JButton”之前选择了一个或多个元素时会发生什么。
我能够重现你问题中描述的行为。这可能是JList
或ListSelectionModel
实现中的一个bug。我解决这个问题的方法是在actionPerformed()
方法中添加代码来处理现有的JList
选择。
这是我修改后的actionPerformed()
方法版本。注意,其余的所有代码都没有改变。首先,我保存了所有选定行的索引。然后我清除了现有的选择。接下来,我将新元素添加到JList
中。现在我需要重新选择在添加新元素之前被选中的行。但请注意,我需要将每个索引增加一,因为在索引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);
}
}
});
英文:
I see that you basically copied the code in the link in your question. That example only deals with adding a single element to the JList
when clicking the JButton
. It does not deal with the JList
selection
JList
before clicking the JButton
.
I was able to reproduce the behavior described in your question. It may be a bug in the implementation of JList
or ListSelectionModel
. The way I fixed it is to add code to method actionPerformed()
that handles any existing JList
selections.
Here is my modified version of method actionPerformed()
. Note that all the rest of the code is unchanged. First I save the indexes of all the selected rows. Then I clear the existing selections. Then I add the new element to the JList
. Now I need to re-select the rows that were selected before I added the new element. But note that I need to increment each index by one, because there is a new element at index 0 (zero).
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);
}
}
});
答案2
得分: 1
来自JList#setSelectionMode(int)的文档:<br/>
> ListSelectionModel.SINGLE_SELECTION - 一次只能选择一个列表索引。在此模式下,setSelectionInterval 和 addSelectionInterval 的效果相同,都将当前选择替换为由第二个参数(“引导”)表示的索引。
尝试使用 jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
英文:
From the documentation of JList#setSelectionMode(int): <br/>
> 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").
try jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
答案3
得分: 0
你可以将这段代码添加到你的jb.addActionListner()
中:
int x = jlist.getSelectedIndex();
jlist.clearSelection();
jlist.setSelectedIndex(x);
这样应该能够按照你的预期工作!
英文:
You can add this in your jb.addActionListner():
int x = jlist.getSelectedIndex();
jlist.clearSelection();
jlist.setSelectedIndex(x);
This should work just the way you want it to!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论