QHYun_practice-14
本质上就是在一个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 自动生成的方法存根 } }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号