【问题标题】:JTable Drag and Drop using TransferHandler使用 TransferHandler 进行 JTable 拖放
【发布时间】:2012-10-25 19:38:14
【问题描述】:

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

【问题讨论】:

    标签: java swing drag-and-drop jtable


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 2012-10-04
      • 1970-01-01
      • 2021-05-25
      • 2010-10-17
      • 2016-03-14
      相关资源
      最近更新 更多