2012-10-25 47 views
1

目前我有兩個表格Table-A, Table-B。我的任務是將行從表A拖到表B或將表B中的行拖到本身。使用TransferHandler我已經完成了這項任務。但我的問題是,我無法識別哪個表格行被拖動到Table-B ..即從表格A到表格B或從表格B到其本身。在exportData方法TransferHandler我將一些額外的數據添加到其中一列。基於此,當我通過importData方法導入數據時,我能夠從哪個表中找出使用哪個列添加數據的特定列。我知道這根本不是建議的......所以我需要知道是否有一種很好的方法來解決這個問題?JTable拖放使用TransferHandler

回答

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

這是一個非常基本的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 
} 
+1

+1的想法..讓我試試這個.. :) – Amarnath