使用TransferHandler进行JTable拖放

Ama*_*ath 1 java swing drag-and-drop jtable

目前我有两张桌子说Table-A, Table-B.我的任务是将行从Table-A拖到Table-B或将Table-B中的行拖到自身上.使用TransferHandler我已经完成了这项任务.但我的问题是,我无法识别从哪个表行被拖动到Table-B...即,从表-A到表-B或从表-B到自身.在exportData方法中TransferHandler我将一些额外的数据添加到其中一个列.基于此,当我通过importData方法导入数据时,我能够找出使用我添加数据的特定列来自哪个表.我知道这根本没有被推荐..所以我需要知道是否有一个很好的方法来解决这个问题?

ten*_*ica 5

您可以创建自己的实现Transferable,它将具有对源组件的引用.然后,TransferHandler.importData()您可以将其与TransferSupport.getComponent()目标组件进行比较.

例如,这是一个将被传输的字符串的包装器:

public class DataWrapper {
    String data;
    Object source;

    public DataWrapper(String data, Object source) {
        super();
        this.source = source;
        this.data = data;
    }

    public String getData() {
        return data;
    }
    public Object getSource() {
        return source;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常基本的Transferable实现.

public class DataWrapperTransferable implements Transferable {
    public static DataFlavor FLAVOR = new DataFlavor(DataWrapper.class,
            "DataWrapper");

    private DataFlavor flavors[];
    private DataWrapper dataWrapper;

    public DataWrapperTransferable(String data, Object source) {
        dataWrapper = new DataWrapper(data, source);
        flavors = new DataFlavor[] { FLAVOR };
    }

    @Override
    public Object getTransferData(DataFlavor flavor)
            throws UnsupportedFlavorException, IOException {
        if (flavor.equals(FLAVOR)) {
            return dataWrapper;
        } else {
            throw new UnsupportedFlavorException(flavor);
        }
    }

    @Override
    public DataFlavor[] getTransferDataFlavors() {
        return flavors;
    }

    @Override
    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return flavor.equals(FLAVOR) || flavor.equals(DataFlavor.stringFlavor);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在TransferHandler:

public boolean importData(TransferSupport support) {
    DataWrapper dataWrapper = (DataWrapper) support
            .getTransferable().getTransferData(
                    DataWrapperTransferable.FLAVOR);

    if (dataWrapper.getSource() == support.getComponent()) {
        //the originator and destination are the same 
    } else {
        //drop from another component
    }               

    //rest of the method
}
Run Code Online (Sandbox Code Playgroud)