两个JList模型没有使用所有数据

时间:2013-11-15 18:32:19

标签: java arrays swing sorting jlist

我有两个JLists有两个模型(inputList inputModeloutputList 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;
}

1 个答案:

答案 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;
    }
}