📄 treetransferhandler.java
字号:
package g2w.app.gchm.gui;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import javax.swing.JComponent;
import javax.swing.JTree;
import javax.swing.TransferHandler;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
/**
* TreeTransferHandler is used to handle transfering
* nodes.
* @author GreatGhoul
* @version 025 2009-3-21 9:18:07
*/
public class TreeTransferHandler extends TransferHandler {
private ContentTreeNode selNode;
private ContentTreeNode oldParent;
private ContentTreeNode newParent;
private JTree.DropLocation dl;
private int childIndex;
/**
* Constructs a new tree transfer handler.
*/
public TreeTransferHandler() {}
/**
* Returns if the tranferable data can be accepted by the target.
* returns true, if the data can be accepted by the target
*
* @param support The object containing the details of the transfer, not null.
* @return True if the import can happen, false otherwise
*/
public boolean canImport(TransferHandler.TransferSupport support) {
// 设置显示放置标记.
support.setShowDropLocation(true);
// 如果此support不表示放置操作,拒绝放置.
if (!support.isDrop()) return false;
// 如果传送数据的格式不兼容,拒绝放置.
if (!support.isDataFlavorSupported(TransferableNode.FLAVOR))
return false;
if (selNode.isRoot()) return false;
// 获取放置点的父节点.
dl = (JTree.DropLocation) support.getDropLocation();
newParent = (ContentTreeNode) dl.getPath().getLastPathComponent();
// 如果父节点为空,拒绝放置.
if (newParent == null) return false;
// 如果放置点为源节点,拒绝放置.
if (newParent.equals(selNode)) return false;
// 如果一颗子树欲拖放至其子树中,拒绝放置.
if (!selNode.isLeaf() && selNode.getLevel() < newParent.getLevel())
return false;
return true;
}
/**
* 创建一个要用作数据传输源的 Transferable.
*
* @param c 存储要传输的数据的组件
*/
protected Transferable createTransferable(JComponent c) {
try {
ContentTree tree = (ContentTree) c;
// 获取源节点.
TreePath path = tree.getSelectionPath();
selNode = (ContentTreeNode) path.getLastPathComponent();
// 获取源节点的父节点.
oldParent = (ContentTreeNode) selNode.getParent();
// 封装并返回待传送的数据.
return new TransferableNode((ContentTreeNode) selNode.clone());
} catch (NullPointerException e) {
return null;
}
}
/**
* 移动节点成功后更新xml数据.
*/
protected void exportDone(JComponent source, Transferable data, int action) {
if (action == MOVE) {
// Get the user object.
ContentElement selElem = selNode.getUserObject();
ContentElement tagElem = newParent.getUserObject();
// Move the element to the new path.
selElem.moveTo(tagElem, childIndex);
ContentTree tree = (ContentTree) source;
tree.setSelection(selNode);
}
}
public int getSourceActions(JComponent c) {
return MOVE;
}
public boolean importData(TransferHandler.TransferSupport support) {
if (!canImport(support)) return false;
try {
Transferable transferable = support.getTransferable();
ContentTreeNode node = (ContentTreeNode) transferable.getTransferData(
TransferableNode.FLAVOR);
} catch (UnsupportedFlavorException ufe) {
System.out.println("UnsupportedFlavor: " + ufe.getMessage());
} catch (java.io.IOException ioe) {
System.out.println("I/O error: " + ioe.getMessage());
}
// Get the tree model.
ContentTree tree = (ContentTree) support.getComponent();
ContentTreeModel model = (ContentTreeModel) tree.getModel();
// Get the drop location's index.
childIndex = dl.getChildIndex();
// Fix the drop index.
if (childIndex == -1)
childIndex = newParent.getChildCount();
if (oldParent.equals(newParent)
&& childIndex > model.getIndexOfChild(oldParent, selNode))
childIndex -= 1;
// Remove the node from the old parent.
model.removeNodeFromParent(selNode);
// Insert the node into the new parent.
model.insertNodeInto(selNode, newParent, childIndex);
return true;
}
public String toString() {
return getClass().getName();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -