複数の行 (不連続) を 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 に到達すると、リスト/オブジェクト自体がまだ表示されているとはいえ、配列リスト内の値が返されます。cObjectList
getTransferDat
null
size =3
ツリーに選択されたドロップ モードは次のとおりです。
treeObjectStructure.setTransferHandler(新しい ObjectTreeTransferHandler()); treeObjectStructure.setDropMode(DropMode.ON_OR_INSERT);
私が間違ったことを理解するのを手伝ってくれる人はいますか?