1

我正在尝试将多行(不连续)从 jtable 拖动到 jtree。我正在使用定制的可转移对象和定制的转移处理程序。

getTransferData(DataFlavor df)但是,我在 import data 方法中丢失了我的对象,因为它在 class中的 java 方法中丢失了DropTargetContext.java

代码如下:

public class cObjectList extends ArrayList<cObject> implements Transferable, Serializable {    

public static DataFlavor OBJECT_LIST_FLAVOR = new DataFlavor(cObjectList.class, "Object List");
    private DataFlavor flavors[] = { OBJECT_LIST_FLAVOR };

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

@Override
    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return flavor.getRepresentationClass() == cObjectList .class;    }//end method isDataFlavorSupported

@Override
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
        if (isDataFlavorSupported(flavor)) {  return this; } else { 
throw new UnsupportedFlavorException(flavor);        }//end else
    }//end method getTransferData    
}//end class  cObjectList

cObject 类是可序列化的。自定义的传输处理程序被声明为面板中的内部类,其中包含树和表。*/

class ObjectTreeTransferHandler extends TransferHandler{
/*the createTransferable method successfully creates the transfer object */
@Override
    public boolean importData(TransferSupport support) {
        if (!canImport(support)) {
            return false;
        }
        if (support.isDataFlavorSupported(cObjectList.OBJECT_LIST_FLAVOR)) {            
            cObjectList obList = null;
            try {
                Transferable t = support.getTransferable();               
                obList = (cObjectList) t.getTransferData(cObjectList.OBJECT_LIST_FLAVOR);
            } catch (UnsupportedFlavorException ufe) {
                System.out.println("UnsupportedFlavor: " + ufe.getMessage());
                return false;
            } catch (java.io.IOException ioe) {
                new myException(ioe);
                return false;
            }

            if (obList != null && support.getComponent() instanceof myJTree) {
//do work 
            }//end if
}//end inner class ObjectTreeTransferHandler

可转移对象t正确包含数组列表中的对象,但是当我调用 时t.getTransferData,数组列表会返回null对象。例如,如果从表中选择了三行,这会调用getTransferData 方法,在cObjectList该方法中正确地返回数组列表中的这些对象,但是当它到达getTransferDatDropTargetContext.java 中的 a 时,null即使列表/对象本身仍然显示,数组列表中的值也会返回size =3

为树选择的放置模式是:

treeObjectStructure.setTransferHandler(new ObjectTreeTransferHandler()); treeObjectStructure.setDropMode(DropMode.ON_OR_INSERT);

谁能帮我弄清楚我做错了什么?

4

2 回答 2

1

我赞成上面的答案。我遇到了同样的问题,我只是使用莱尔所说的解决了这个问题:

class TransferablePanel implements Transferable {
   protected static  DataFlavor PANELFLAVOR = new DataFlavor(Object.class, "A 
   JPanel Object");//instead JPanel.class I used Object.class ****
   protected static DataFlavor[] supportedFlavors = { PANELFLAVOR };
   JPanel panel;
      public TransferablePanel(JPanel panel) {
         this.panel = panel;
      }

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

     @Override
     public boolean isDataFlavorSupported(DataFlavor flavor) {
         if (flavor.equals(PANELFLAVOR))
              return true;
         return false;
      } 

     @Override
     public Object getTransferData(DataFlavor flavor) throws 
     UnsupportedFlavorException {

if (flavor.equals(PANELFLAVOR)){
    return panel;
}
else
  throw new UnsupportedFlavorException(flavor);
  }
 }
于 2018-05-22T20:48:43.750 回答
0

I had a similar problem, and it turned out that the first argument to the DataFlavor constructor has to be Object.class. If it's myclass.class, then I too get null returned from getTransferData, and it throws an IOException. I have no idea why this occurs. It took me several hours to determine this.

于 2013-11-22T07:36:00.377 回答