1

複数の行 (不連続) を jtable から jtree にドラッグしようとしています。カスタマイズされた転送可能オブジェクトとカスタマイズされた転送ハンドラを使用しています。

getTransferData(DataFlavor df)ただし、クラス内の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オブジェクトに戻ります。たとえば、テーブルから 3 つの行が選択された場合、これはこれらのオブジェクトを arraylist で正しく返すgetTransferData メソッドを呼び出しますが、DropTargetContext.java で a に到達すると、リスト/オブジェクト自体がまだ表示されているとはいえ、配列リスト内の値が返されます。cObjectListgetTransferDatnullsize =3

ツリーに選択されたドロップ モードは次のとおりです。

treeObjectStructure.setTransferHandler(新しい 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

同様の問題がありましたが、DataFlavor コンストラクターの最初の引数は Object.class でなければならないことがわかりました。myclass.class の場合、私も getTransferData から null が返され、IOException がスローされます。なぜこれが起こるのか分かりません。これを判断するのに数時間かかりました。

于 2013-11-22T07:36:00.377 に答える