📄 treeframe.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 + -