树的可见区域的获取和滚动条监听

1.树的前序,中序,后序遍历
2.树所在面板的滚动条监听
3.树的可见区域的获取

package treeTest;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.util.Enumeration;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class Treetest extends JFrame {
    private DefaultMutableTreeNode root; // 定义根节点.

    JTree tree;

    // 主方法.
    public static void main(String[] args) {
        // 实例化本类.
        Treetest frame = new Treetest();
        frame.setVisible(true);
    }

    // 构造方法.
    public Treetest() {
        super(); // 继承父类.
        setTitle("遍历节点方法"); // 设置窗口标题.
        setBounds(100, 100, 300, 300); // 设置绝对位置.
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口关闭方法.

        root = new DefaultMutableTreeNode("ROOT"); // 设置根节点名.
        DefaultMutableTreeNode noteA = new DefaultMutableTreeNode("FirstA"); // 定义及设置第一个子节点.
        root.add(noteA); // 将第一节点添加到树根上.
        // 给noteA增加两个子节点.
        noteA.add(new DefaultMutableTreeNode("SecondAA"));
        noteA.add(new DefaultMutableTreeNode("SecondAB"));
        DefaultMutableTreeNode noteB = new DefaultMutableTreeNode("FirstB");// 定义及设置第二个子节点.
        root.add(noteB);

        DefaultMutableTreeNode noteC = new DefaultMutableTreeNode("FirstC");// 定义及设置第三个子节点.
        root.add(noteC);
        noteC.add(new DefaultMutableTreeNode("SecondCA"));// 为noteC增加子节点.
        DefaultMutableTreeNode noteSecondCB = new DefaultMutableTreeNode(
                "SecondCB");// 为noteC增加子节点.
        noteC.add(noteSecondCB);// 将noteSecondCB添加到noteC子节点下.
        // 给noteSecondCB增加子节点.
        noteSecondCB.add(new DefaultMutableTreeNode("SecondCBA"));
        noteSecondCB.add(new DefaultMutableTreeNode("SecondCBB"));
        // 给noteC增加SecondCC子节点.
        noteC.add(new DefaultMutableTreeNode("SecondCC"));

        DefaultMutableTreeNode noteD = new DefaultMutableTreeNode("FirstD");// 定义及设置第三个子节点.
        root.add(noteD);

        DefaultMutableTreeNode noteE = new DefaultMutableTreeNode("FirstE");// 定义及设置第三个子节点.
        root.add(noteE);

        DefaultMutableTreeNode noteF = new DefaultMutableTreeNode("FirstF");// 定义及设置第三个子节点.
        root.add(noteF);

        DefaultMutableTreeNode noteG = new DefaultMutableTreeNode("FirstG");// 定义及设置第三个子节点.
        root.add(noteG);

        DefaultMutableTreeNode noteH = new DefaultMutableTreeNode("FirstH");// 定义及设置第三个子节点.
        root.add(noteH);

        DefaultMutableTreeNode noteI = new DefaultMutableTreeNode("FirstI");// 定义及设置第三个子节点.
        root.add(noteI);


        tree = new JTree(root);// 根据根节点创建树.
        JScrollPane jscrcoll = new JScrollPane(tree);
        getContentPane().add(jscrcoll, BorderLayout.CENTER);


        JScrollBar jscrollBar = jscrcoll.getVerticalScrollBar();
        //监听滚动条
        jscrollBar.addAdjustmentListener(new AdjustmentListener() {

            @Override
            public void adjustmentValueChanged(AdjustmentEvent e) {
                // 用户一直拖动时,返回true,用户停止拖动时,返回false
                if(e.getValueIsAdjusting()){
                    return;
                }
            }
        });


        createOperationPanel();

    }

    private void createOperationPanel() {
        // 开始操作节点.
        // 定义Panel.
        final JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(0, 1)); // 设置panel为网格布局.
        getContentPane().add(panel, BorderLayout.EAST); // 将panel放置到窗口右边.

        final JButton button_01 = new JButton("按前序遍历节点"); // 定义及设置第一个按钮.
        button_01.addActionListener(new ButtonActionListener("按前序遍历节点"));
        panel.add(button_01); // 将按钮放置到panel里.
        final JButton button_02 = new JButton("按后序遍历节点"); // 定义及设置第二个按钮.
        button_02.addActionListener(new ButtonActionListener("按后序遍历节点"));
        panel.add(button_02); // 将按钮放置到panel里.
        final JButton button_03 = new JButton("以广度遍历节点"); // 定义及设置第三个按钮.
        button_03.addActionListener(new ButtonActionListener("以广度遍历节点"));
        panel.add(button_03); // 将按钮放置到panel里.
        final JButton button_04 = new JButton("以深度遍历节点"); // 定义及设置第四个按钮.
        button_04.addActionListener(new ButtonActionListener("以深度遍历节点"));
        panel.add(button_04); // 将按钮放置到panel里.
        final JButton button_05 = new JButton("遍历直属子节点"); // 定义及设置第五个按钮.
        button_05.addActionListener(new ButtonActionListener("遍历直属子节点"));
        panel.add(button_05); // 将按钮放置到panel里.
    }

    // 定义按钮点击事件.
    private class ButtonActionListener implements ActionListener {
        private String mode;// 定义mode变量.

        // 构造方法.

        public ButtonActionListener(String mode) {
            this.mode = mode;
        }

        // 定义激活方法.
        public void actionPerformed(ActionEvent e) {
            // 声明节点枚举对象.
            Enumeration<?> enumeration;
            if (mode.equals("按前序遍历节点")) {
                // 按前序遍历根节点.
                enumeration = root.preorderEnumeration();
            } else if (mode.equals("按后序遍历节点")) {
                enumeration = root.postorderEnumeration();
            } else if (mode.equals("以广度遍历节点")) {
                enumeration = root.breadthFirstEnumeration();
            } else if (mode.equals("以深度遍历节点")) {
                enumeration = root.depthFirstEnumeration();
            } else {
                enumeration = root.children();// 遍历该节点的所有子节点.
            }


            printTreeVisibleRect();
            // 知道了遍历方式,开始遍历.
            while (enumeration.hasMoreElements()) { // 遍历枚举对象.
            // 先定义一个节点变量.
                DefaultMutableTreeNode node;
                node = (DefaultMutableTreeNode) enumeration.nextElement();// 将节点名称给node.
                // 根据级别输出占位符.
                for (int l = 0; l < node.getLevel(); l++) {
                    System.out.print("---");
                }
                System.out.println(node.getUserObject());// 输入节点标签.
                treeIsVisible(node);
            }
            System.out.println();
            System.out.println();
        }

        /**
         * 打印树的可见区域,当用户改变对话框的大小时,树的可见区域发生变化
         */
        private void printTreeVisibleRect() {
            Rectangle rect = tree.getVisibleRect();
            System.out.println("x"+rect.x + "y"+rect.y +"width"+rect.width +"height"+rect.height );
        }

        /**
         * 判断节点是否可见
         * @param node
         */
        private void treeIsVisible(DefaultMutableTreeNode node) {
            DefaultTreeModel treeModel = (DefaultTreeModel)tree.getModel();
            TreePath nodePath = new TreePath(treeModel.getPathToRoot(node));
            System.out.println(nodePath);
            if(tree.isVisible(nodePath)){
                System.out.println("可见");
            } else{
                System.out.println("不可见");
            }
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值