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 自动生成的方法存根
 
    }
 
}

 

posted @ 2025-07-21 09:36  Wind_Swing_Dunn  阅读(5)  评论(0)    收藏  举报