您的位置:首页 > 其它

递归-这个学了N年的东西。今天再来搞一下

2007-01-26 16:28 429 查看
下面是利用递归实现打印当前类的父类层次结构。其实的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐