0

我创建了一个自定义 DefaultMutableTreeNode。现在我想在树上执行拖放操作,它工作正常,但我想在被删除后删除节点。但问题是我可以将节点插入模型但不能从模型中删除。

public class ORDnd extends TransferHandler {

ObjectNode sourceNode;
ObjectNode destinationParent;

@Override
public int getSourceActions(JComponent c) {
    return MOVE;
}

@Override
protected Transferable createTransferable(JComponent source) {
    return new TransferableNode((ObjectNode) ((JTree) source).getSelectionPath().getLastPathComponent(), DataFlavors.ORDataFlavor);
}

@Override
public boolean canImport(TransferHandler.TransferSupport support) {
    if (!support.isDrop()) {
        return false;
    }
    try {
        if (support.isDataFlavorSupported(DataFlavors.ORDataFlavor)) {
            sourceNode = (ObjectNode) support.getTransferable().getTransferData(DataFlavors.ORDataFlavor);
        } else {
            return false;
        }

    } catch (UnsupportedFlavorException | IOException ex) {
        Logger.getLogger(ReusableDnd.class.getName()).log(Level.SEVERE, null, ex);
    }

    JTree.DropLocation dropLocation = (JTree.DropLocation) support.getDropLocation();
    TreePath path = dropLocation.getPath();
    if (path == null) {
        return false;
    }
    destinationParent = (ObjectNode) path.getLastPathComponent();
    return (destinationParent.isRoot() && sourceNode.isPage()) || (destinationParent.isPage() && sourceNode.isObject());
}

@Override
public boolean importData(TransferHandler.TransferSupport support) {
    if (!canImport(support)) {
        return false;
    }
        JTree tree = (JTree) support.getComponent();
        DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
        if (destinationParent.getNode(sourceNode.getText()) == null) {

         /**  if (support.getSourceDropActions() == MOVE) {
                model.removeNodeFromParent(sourceNode);//Not removing the node from the model
            } **/ 

            if (support.isDrop() && support.getDropAction() == MOVE) 
           {
           model.removeNodeFromParent(sourceNode);//Working bcoz changed getSourceDropActions to getDropAction
             }
            model.insertNodeInto(sourceNode, destinationParent, destinationParent.getChildCount());//this is working fine
            model.reload(sourceNode);
      return true;
        }

    return false;
}
}
4

1 回答 1

0

问题是我忘了添加 exportDone。现在它工作得很好

 @Override
protected void exportDone(JComponent source, Transferable data, int action) {
    if (action != MOVE) {
        return;
    }
    DefaultTreeModel model = (DefaultTreeModel) ((JTree) source).getModel();
    try {
        model.removeNodeFromParent((ObjectNode) data.getTransferData(DataFlavors.ORDataFlavor));
    } catch (UnsupportedFlavorException | IOException ex) {
        Logger.getLogger(ORDnd.class.getName()).log(Level.SEVERE, null, ex);
    }

}
于 2014-12-09T10:55:30.277 回答