Java 重新排列JList和ArrayList

Java 重新排列JList和ArrayList,java,swing,list,sorting,collections,Java,Swing,List,Sorting,Collections,因此,我有一个GUI组件,其中JList依赖于任务的ArrayList。此任务对象有一个特定的索引,我希望JList反映该特定顺序。到目前为止,这没有问题。 问题是,我希望用户在JList中拖放对象以更改顺序。我希望ArrayList(支持Jlist)也反映这些更改 以下是我的TransferHandler类: class ListItemTransferHandler extends TransferHandler { private final DataFlavor localObj

因此,我有一个GUI组件,其中JList依赖于任务的ArrayList。此任务对象有一个特定的索引,我希望JList反映该特定顺序。到目前为止,这没有问题。 问题是,我希望用户在JList中拖放对象以更改顺序。我希望ArrayList(支持Jlist)也反映这些更改

以下是我的TransferHandler类:

class ListItemTransferHandler extends TransferHandler {
    private final DataFlavor localObjectFlavor;
    private Object[] transferedObjects = null;

    public ListItemTransferHandler() {
        localObjectFlavor = new ActivationDataFlavor(Object[].class, DataFlavor.javaJVMLocalObjectMimeType, "Array of items");
    }

    @SuppressWarnings("deprecation")
    @Override
    protected Transferable createTransferable(JComponent c) {
        JList list = (JList) c;
        indices = list.getSelectedIndices();
        transferedObjects = list.getSelectedValues();
        return new DataHandler(transferedObjects, localObjectFlavor.getMimeType());
    }

    @Override
    public boolean canImport(TransferSupport info) {
        if (!info.isDrop() || !info.isDataFlavorSupported(localObjectFlavor)) {
            return false;
        }
        return true;
    }

    @Override
    public int getSourceActions(JComponent c) {
        return MOVE; // TransferHandler.COPY_OR_MOVE;
    }

    @SuppressWarnings("unchecked")
    @Override
    public boolean importData(TransferSupport info) {
        if (!canImport(info)) {
            return false;
        }
        JList target = (JList) info.getComponent();
        JList.DropLocation dl = (JList.DropLocation) info.getDropLocation();
        DefaultListModel listModel = (DefaultListModel) target.getModel();
        int index = dl.getIndex();
        int max = listModel.getSize();
        if (index < 0 || index > max) {
            index = max;
        }
        addIndex = index;
        try {
            Object[] values = (Object[]) info.getTransferable().getTransferData(localObjectFlavor);
            addCount = values.length;
            for (int i = 0; i < values.length; i++) {
                int idx = index++;
                listModel.add(idx, values[i]);
                target.addSelectionInterval(idx, idx);
            }
            return true;
        } catch (UnsupportedFlavorException ufe) {
            ufe.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return false;
    }

    @Override
    protected void exportDone(JComponent c, Transferable data, int action) {
        cleanup(c, action == MOVE);
    }

    private void cleanup(JComponent c, boolean remove) {
        if (remove && indices != null) {
            JList source = (JList) c;
            DefaultListModel model = (DefaultListModel) source.getModel();
            if (addCount > 0) {
                // http://java-swing-tips.googlecode.com/svn/trunk/DnDReorderList/src/java/example/MainPanel.java
                for (int i = 0; i < indices.length; i++) {
                    if (indices[i] >= addIndex) {
                        indices[i] += addCount;
                    }
                }
            }
            for (int i = indices.length - 1; i >= 0; i--) {
                model.remove(indices[i]);
            }
        }
        indices = null;
        addCount = 0;
        addIndex = -1;
    }

    private int[] indices = null;
    private int addIndex = -1; // Location where items were added
    private int addCount = 0; // Number of items added.
}
类ListItemTransferHandler扩展了TransferHandler{
私有最终DataFlavor localObjectFlavor;
私有对象[]TransferDobjects=null;
公共ListItemTransferHandler(){
localObjectFlavor=new ActivationDataFlavor(Object[].class,DataFlavor.javaJVMLocalObjectMimeType,“项目数组”);
}
@抑制警告(“弃用”)
@凌驾
受保护的可转让组件(JComponent c){
JList=(JList)c;
index=list.getSelectedIndices();
TransferDobjects=list.getSelectedValues();
返回新的DataHandler(TransferDobjects,localObjectFlavor.getMimeType());
}
@凌驾
公共布尔值canImport(传输支持信息){
如果支持(!info.isDrop()| |!info.isDataFlavor(localObjectFlavor)){
返回false;
}
返回true;
}
@凌驾
public int getSourceActions(JComponent c){
return MOVE;//TransferHandler.COPY\u或\u MOVE;
}
@抑制警告(“未选中”)
@凌驾
公共布尔输入数据(传输支持信息){
如果(!canImport(信息)){
返回false;
}
JList target=(JList)info.getComponent();
JList.DropLocation dl=(JList.DropLocation)info.getDropLocation();
DefaultListModel listModel=(DefaultListModel)target.getModel();
int index=dl.getIndex();
int max=listModel.getSize();
如果(索引<0 | |索引>最大值){
指数=最大值;
}
addIndex=指数;
试一试{
对象[]值=(对象[])info.getTransferable().getTransferData(localObjectFlavor);
addCount=values.length;
对于(int i=0;i0){
// http://java-swing-tips.googlecode.com/svn/trunk/DnDReorderList/src/java/example/MainPanel.java
对于(int i=0;i=addIndex){
索引[i]+=addCount;
}
}
}
对于(int i=index.length-1;i>=0;i--){
模型。删除(索引[i]);
}
}
索引=空;
addCount=0;
addIndex=-1;
}
私有int[]索引=null;
private int addIndex=-1;//添加项的位置
private int addCount=0;//添加的项目数。
}

我将如何实现此功能?我想这会有所帮助,但任务对象实现的排序与之相当。

不要将数据保存在两个位置。ListModel应该包含数据。不需要ArrayList。DefaultListModel使用向量保存数据。如果您不喜欢,那么创建一个使用ArrayList的自定义ListModel。独立于具体实现:您可以对列表进行排序,也可以允许用户重新排列,而不是两者都可以。或者-如果重新安排意味着任务的重新索引-您需要实现一些逻辑来完成它。最好展示一个SSCCE,该SSCCE演示了当前的行为,并用该示例准确地解释了您想要什么。