3.5 主界面——文件树

        本质上就是在一个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 自动生成的方法存根

    }

}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值