⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treeframe.java

📁 C语言的词法、语法分析器 输出语法分析树
💻 JAVA
字号:
/****
 * This class is to display the parsing tree in a tree panel.
 */
package cminus;

import java.util.*;
import java.awt.*;
import java.util.Stack;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import cminus.ParsingTree.ParsingTreeNode;

public class TreeFrame extends JFrame implements ActionListener {
	JTree tree;//用于图形化表示分析树的Swing控件
	JButton launchOut = new JButton("全部展开");//展开树的按钮
	JButton merge = new JButton("取消展开");//关闭树的按钮
	//与JTree有关的声明
	DefaultTreeModel treeModel;
	DefaultMutableTreeNode root;
	//分析树构建的类
	ParsingTree parsingTree;
	//用于token处理的类
	TokenProcess tokenPro = new TokenProcess();
	
	/**
	 * 构造函数
	 * @param init
	 */
	public TreeFrame(ParsingTree init) {
		super("Parsing Tree");
		this.parsingTree = init;
		setSize(600, 500);
        setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	/***
	 * 初始化分析树控件
	 *
	 */
	public void init() {
		root = new DefaultMutableTreeNode("Parsing Tree");
		treeModel = new DefaultTreeModel(root);
		tree = new JTree(treeModel);
		this.preOrder(this.parsingTree.root, this.root);
	}
	
	/***
	 * 前序遍历分析树,构建JTree控件,递归实现
	 * @param localRoot   -当前节点
	 * @param root		  -父节点
	 */
	private void preOrder(ParsingTreeNode localRoot, DefaultMutableTreeNode root) {
		if (localRoot != null) {
			DefaultMutableTreeNode localRootNode = new DefaultMutableTreeNode(
					localRoot.data);
			if (!localRoot.isLeaf()) {
				localRootNode = root;
				for (int i = 0; i < localRoot.child.length; i++) {
					if (localRoot.child[i] != null) {
						DefaultMutableTreeNode tmp = new DefaultMutableTreeNode(
								localRoot.child[i].data);
						localRootNode.add(tmp);
						preOrder(localRoot.child[i], tmp);
					}
				}
			}
		}
	}
	
	/***
	 * Display the parsing tree .
	 *
	 */
	public void displayParsingTree() {
		// Display it.
		JScrollPane scrollPane = new JScrollPane(tree);
		getContentPane().add(scrollPane, BorderLayout.CENTER);
		JPanel panel = new JPanel();
		launchOut.addActionListener(this);
		merge.addActionListener(this);
		final JLabel messageLabel = new JLabel("Nothing selected.");
		add(messageLabel, BorderLayout.SOUTH);
		panel.add(launchOut);
		panel.add(merge);
		add(panel, BorderLayout.NORTH);
		// Add our selection listener and have it report to
		// our messageLabel.
		tree.addTreeSelectionListener(new TreeSelectionListener() {
			public void valueChanged(TreeSelectionEvent tse) {
				TreePath tp = tse.getNewLeadSelectionPath();
				messageLabel.setText("Current selected→ "
						+ tp.getLastPathComponent());
			}
		});
		this.setVisible(true);
	}

	/**
	 *完全展开一个JTree 
	 * 
	 * @param tree JTree
	 */
	public static void expandTree(JTree tree,boolean isLaunch) {
		TreeNode root = (TreeNode) tree.getModel().getRoot();
		expandAll(tree, new TreePath(root), isLaunch);
	}

	/***************************************************************************
	 * 完全展开或关闭一个树,用于递规执行
	 * 
	 * @param tree JTree
	 * @param parent 父节点
	 * @param expand 为true则表示展开树,否则为关闭整棵树
	 */
	private static void expandAll(JTree tree, TreePath parent, boolean expand) {
		// Traverse children
		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);
			}
		}
		// Expansion or collapse must be done bottom-up
		if (expand) {
			tree.expandPath(parent);
		} else {
			tree.collapsePath(parent);
		}
	}
	/**
	 * 相应按钮的事件操作
	 */
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource() == launchOut) {
			this.expandTree(tree, true);
		} else if (e.getSource() == merge) {
			this.expandTree(tree,false);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -