使用TransferHandler进行JTable拖放

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

您可以创建自己的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; } } 

这是一个非常基本的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); } } 

然后,在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 }