下面是利用递归实现打印当前类的父类层次结构。其实的addClass()方法是递归方法。
递归是一种循环调用自身的方法结构,有一定的中止条件。
————————————————————————————————————————————————
代码实例:
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;
import java.lang.reflect.Modifier;
/**
* User: jianshe
* Date: 2007-1-26
* Time: 9:24:50
*/
public class ClassTree {
public static void main(String[] args) {
ClassTreeFrame classTreeFrame = new ClassTreeFrame();
classTreeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
classTreeFrame.setVisible(true);
}
}
class ClassTreeFrame extends JFrame {
private DefaultMutableTreeNode root;
private DefaultTreeModel model;
private JTree tree;
private JTextField textField;
public ClassTreeFrame() {
setTitle("ClassTree");
setSize(WIDTH, HEIGHT);
root = new DefaultMutableTreeNode(Object.class);
model = new DefaultTreeModel(root);
tree = new JTree(model);
addClass(getClass());
ClassNameTreeCellRenderer renderer = new ClassNameTreeCellRenderer();
renderer.setClosedIcon(new ImageIcon("red-ball.gif"));
renderer.setOpenIcon(new ImageIcon("yellow-ball.gif"));
renderer.setLeafIcon(new ImageIcon("blue-ball.gif"));
tree.setCellRenderer(renderer);
getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
addTextField();
}
private void addTextField() {
JPanel jPanel = new JPanel();
ActionListener addaActionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text = textField.getText();
try {
addClass(Class.forName(text));
textField.setText("");
} catch (ClassNotFoundException e1) {
JOptionPane.showMessageDialog(null, "Class Not fount");
}
}
};
textField = new JTextField(20);
// jTextField.addActionListener(addaActionListener);
jPanel.add(textField);
JButton addButton = new JButton("Add");
addButton.addActionListener(addaActionListener);
jPanel.add(addButton);
getContentPane().add(jPanel, BorderLayout.SOUTH);
}
public DefaultMutableTreeNode findUserObject(Object obj) {
Enumeration enumeration = root.breadthFirstEnumeration();
while (enumeration.hasMoreElements()) {
DefaultMutableTreeNode o = (DefaultMutableTreeNode) enumeration.nextElement();
if (o.getUserObject().equals(obj)) {
return o;
}
}
return null;
}
public DefaultMutableTreeNode addClass(Class c) {
if (c.isInterface() || c.isPrimitive()) return null;
DefaultMutableTreeNode node = findUserObject(c);
if (node != null) return node;
Class s = c.getSuperclass();
DefaultMutableTreeNode parent;
if (s == null)
parent = root;
else
parent = addClass(s);
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(c);
model.insertNodeInto(newNode, parent, parent.getChildCount());
TreePath treePath = new TreePath(model.getPathToRoot(newNode));
tree.makeVisible(treePath);
return newNode;
}
}
class ClassNameTreeCellRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Class c = (Class) node.getUserObject();
if (plainFont == null) {
plainFont = getFont();
if (plainFont != null) italicFont = plainFont.deriveFont(Font.ITALIC);
if ((c.getModifiers() & Modifier.ABSTRACT) == 0)
setFont(plainFont);
else
setFont(italicFont);
}
return this;
}
private Font plainFont = null;
private Font italicFont = null;
}