我有两个JLists
有两个模型(inputList
inputModel
和outputList
outputModel
)来填充它们。
我有JButton
public void actionPerformed(ActionEvent e){} listener
这是侦听器中的代码:
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < outputModel.getSize(); i++) {
if(inputList.isSelectedIndex(i)){
inputModel.addElement(outputModel.getElementAt(i));
outputModel.remove(i);
}
}
inputList.setModel(sortModel(inputModel));
outputList.setModel(sortModel(outputModel));
}
});
sortModel(Model m)
方法对模型中的字符串进行排序(使用Arrays.sort()
)并返回正确排序的新模型。
本质上,代码旨在将选定的字符串从一个JList移动到另一个JList(可用的东西类型 - &gt;选择的东西来做列表的想法。
问题是这样的:无论我选择转移多少项,模型中只有一半的字符串被转移(特别是每个项目的索引为0,2,4,6等等)
为什么?
排序代码就是这样:
private static DefaultListModel<String> sortModel(DefaultListModel<String> model){
String[] temp = new String[model.getSize()];
int size = model.getSize();
if(!model.isEmpty()){
for (int i = 0; i < size; i++) {
temp[i] = model.getElementAt(i);
}
Arrays.sort(temp);
model.clear();
for (int i = 0; i < size; i++) {
model.addElement(temp[i]);
}
}
return model;
}
答案 0 :(得分:2)
看看你的循环
for (int i = 0; i < outputModel.getSize(); i++) {
if(inputList.isSelectedIndex(i)){
inputModel.addElement(outputModel.getElementAt(i));
outputModel.remove(i);
}
}
如果选择了一个对象,则将其添加到inputModel并立即将其从outputModel中删除,这会导致下一个元素i + 1
移动到当前位置i
。然后循环递增,从而跳过“next”元素,因为它在i - 1
处。
也许你想为这样的问题编写一个可重用的实用程序类。
以下代码只是一个示例,您可以对其进行改进。
public class JLists {
public static <T> void moveSelection(JList<T> fromList, JList<T> toList) {
ListSelectionModel fromSelection = fromList.getSelectionModel();
ListModel<T> fromModel = fromList.getModel();
ListModel<T> toModel = toList.getModel();
DefaultListModel<T> newFromModel = createModelCopy(fromModel);
DefaultListModel<T> newToModel = createModelCopy(toModel);
int minSelection = fromSelection.getMinSelectionIndex();
int maxSelection = fromSelection.getMaxSelectionIndex();
int removedElements = 0;
for (int i = minSelection; i <= maxSelection; i++) {
if (fromSelection.isSelectedIndex(i)) {
T elementAt = fromModel.getElementAt(i);
newToModel.addElement(elementAt);
newFromModel.removeElementAt(i - removedElements);
removedElements++;
}
}
fromList.setModel(newFromModel);
toList.setModel(newToModel);
}
private static <T> DefaultListModel<T> createModelCopy(
ListModel<T> listModel) {
DefaultListModel<T> newListModel = new DefaultListModel<>();
for (int i = 0; i < listModel.getSize(); i++) {
T elementAt = listModel.getElementAt(i);
newListModel.addElement(elementAt);
}
return newListModel;
}
}