本质上就是在一个panel中加tree,然后通过添加节点和节点的响应来实现的。
在gui的包里建一个DocumentTreePanel的类;因为暂时也没实现什么功能,所以就比较简单的加几个节点看一下就行了。
package QHgui;
import QHgui.docing.SDefaultDockableStateActionFactory;
import SingleService.SingleInstance;
import SingleService.SingleInstanceKey;
import com.javadocking.dock.TabDock;
import com.javadocking.dockable.*;
import com.javadocking.dockable.action.DefaultDockableStateActionFactory;
import tools.MTreeModel;
import tools.MTreeNode;
import tools.SetJtreeIcon;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Enumeration;
import javax.swing.tree.TreeNode;
/**
* <p> TODU </P>
*
* @author yeager
* @Version V1.1.1.0
* @date 2023/11/24 10:34
*/
public class DocumentTreePanel extends JPanel implements MouseListener, TreeSelectionListener {
private MTreeModel treeModel;
public JTree tree;
MTreeNode root;
Image im;
public DocumentTreePanel() {
super(new BorderLayout());
SingleInstance.registerInstance(SingleInstanceKey.DocumentTreePanel,this);
initTree();
tree.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 127) {
//Delete
//doDelete();
tree.requestFocus();
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
});
setFocusTraversalKeysEnabled(false);
}
/**
* 展开一棵树
*
* @param tree
*/
private void expandTree(JTree tree) {
TreeNode node = (TreeNode) tree.getModel().getRoot();
expandAll(tree, new TreePath(node), true);
}
/**
* 完全展开一棵树或关闭一棵树
*
* @param tree JTree
* @param parent 父节点
* @param expand true 表示展开,false 表示关闭
*/
private void expandAll(JTree tree, TreePath parent, boolean expand) {
TreeNode node = (TreeNode) parent.getLastPathComponent();
if (node.getChildCount() > 0) {
for (Enumeration e = node.children(); e.hasMoreElements(); ) {
TreeNode n = (TreeNode) e.nextElement();
TreePath path = parent.pathByAddingChild(n);
expandAll(tree, path, expand);
}
}
if (expand) {
tree.expandPath(parent);
} else {
tree.collapsePath(parent);
}
}
/**
* 初始化树
*/
private void initTree() {
tree = new JTree();
// 创建节点
root = new MTreeNode("Model Tree");
treeModel = new MTreeModel(root);
tree.setModel(treeModel);
//设置JTree的渲染器
// MyTreeCellRenderer renderer = new MyTreeCellRenderer();
// tree.setCellRenderer(renderer);
SetJtreeIcon renderer = new SetJtreeIcon();
tree.setCellRenderer(renderer);
tree.setRootVisible(false);
initNodes();
expandTree(tree);
tree.updateUI();
tree.addMouseListener(this);
tree.addTreeSelectionListener(this);
JScrollPane s = new JScrollPane(tree);
add(s, BorderLayout.CENTER);
}
private void initNodes() {
MTreeNode tGameNode = new MTreeNode("Game");
root.insert(tGameNode, root.getChildCount());
MTreeNode tAlgorithmNode = new MTreeNode("Algorithm");
root.insert(tAlgorithmNode, root.getChildCount());
//游戏部分
MTreeNode tgame1Node = new MTreeNode("Game.game1");
tGameNode.insert(tgame1Node, tGameNode.getChildCount());
//算法部分
MTreeNode tAlgorithm1Node = new MTreeNode("Algorithm.A*算法");
tAlgorithmNode.insert(tAlgorithm1Node, tAlgorithmNode.getChildCount());
tAlgorithm1Node = new MTreeNode("Algorithm.道格拉斯(DP)算法");
tAlgorithmNode.insert(tAlgorithm1Node, tAlgorithmNode.getChildCount());
tree.updateUI();
}
@Override
public void valueChanged(TreeSelectionEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO 自动生成的方法存根
//左键双击
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
TreePath path = tree.getPathForLocation(e.getX(), e.getY());
if (path == null)
return;
MTreeNode node = (MTreeNode) path.getLastPathComponent();
if (node == null)
return;
//System.out.println( node.toString());
if(node.toString().equals("Algorithm.A*算法"))
{
// JAStarPanel starPanel = new JAStarPanel();
// Dockable dockable_mainwork = new DefaultDockable("A*Find.Path", starPanel, "A*Find.Path", null, DockingMode.ALL);
// dockable_mainwork=addNormalLimitActions(dockable_mainwork);
//
// MainWorkingPanel mainWorkingPanel =(MainWorkingPanel)SingleInstance.getInstance(SingleInstanceKey.MainWorkingPanel);
// TabDock centerTabbedDock = mainWorkingPanel.getMainWorkDockable();
// int n = centerTabbedDock.getDockableCount();
// centerTabbedDock.addDockable(dockable_mainwork, new Position(n));
}
else if(node.toString().equals("Algorithm.道格拉斯(DP)算法"))
{
// JAStarPanel starPanel = new JAStarPanel();
// Dockable dockable_mainwork = new DefaultDockable("Algorithm.道格拉斯(DP)算法", starPanel, "Algorithm.道格拉斯(DP)算法", null, DockingMode.ALL);
// dockable_mainwork=addNormalLimitActions(dockable_mainwork);
//
// MainWorkingPanel mainWorkingPanel =(MainWorkingPanel)SingleInstance.getInstance(SingleInstanceKey.MainWorkingPanel);
// TabDock centerTabbedDock = mainWorkingPanel.getMainWorkDockable();
// int n = centerTabbedDock.getDockableCount();
// centerTabbedDock.addDockable(dockable_mainwork, new Position(n));
}
}
}
public Dockable addNormalLimitActions(Dockable dockable)
{
Dockable wrapper = new StateActionDockable(dockable, new SDefaultDockableStateActionFactory(), DockableState.statesClosed());
int[] limitStates = {DockableState.NORMAL, DockableState.MINIMIZED, DockableState.EXTERNALIZED};
wrapper = new StateActionDockable(wrapper, new DefaultDockableStateActionFactory(), limitStates);
return wrapper;
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO 自动生成的方法存根
}
}