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

下面是利用递归实现打印当前类的父类层次结构。其实的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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值