Swing之JTree篇:在树节点中增加图片
斯诺克爱好者网:http://www.kkyule.com淘宝精品导航:http://www.nitaomei.com
如果想改变节点显示效果,可以通过设置setCellRenderer方法来实现。
例子:这个例子是同继承DefaultTreeCellRenderer类,重写getTreeCellRendererComponent方法来改变节点显示方式
public class AnimatedIconTreeExample extends JFrame {public AnimatedIconTreeExample() { super("AnimatedIconTreeExample"); String[] strs = { "CARNIVORA", // 0 "Felidae", // 1 "Acinonyx jutatus(cheetah)", // 2 "Panthera leo(lion)", // 3 "Canidae", // 4 "Canis lupus(wolf)", // 5 "Lycaon pictus(lycaon)", // 6 "Vulpes Vulpes(fox)" }; // 7 IconNode[] nodes = new IconNode; for (int i = 0; i < strs.length; i++) { nodes = new IconNode(strs); } nodes.add(nodes); nodes.add(nodes); nodes.add(nodes); nodes.add(nodes); nodes.add(nodes); nodes.add(nodes); nodes.add(nodes); nodes.setIcon(new ImageIcon("title4.gif")); nodes.setIcon(new ImageIcon("title4.gif")); nodes.setIcon(new ImageIcon("title4.gif")); nodes.setIcon(new ImageIcon("title4.gif")); nodes.setIcon(new ImageIcon("title4.gif")); JTree tree = new JTree(nodes); tree.setCellRenderer(new IconNodeRenderer()); setImageObserver(tree, nodes); JScrollPane sp = new JScrollPane(tree); getContentPane().add(sp, BorderLayout.CENTER);}private void setImageObserver(JTree tree, IconNode[] nodes) { for (int i = 0; i < nodes.length; i++) { ImageIcon icon = (ImageIcon) nodes.getIcon(); if (icon != null) { icon.setImageObserver(new NodeImageObserver(tree, nodes)); } }}class NodeImageObserver implements ImageObserver { JTree tree; DefaultTreeModel model; TreeNode node; NodeImageObserver(JTree tree, TreeNode node) { this.tree = tree; this.model = (DefaultTreeModel) tree.getModel(); this.node = node; } public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) { if ((flags & (FRAMEBITS | ALLBITS)) != 0) { TreePath path = new TreePath(model.getPathToRoot(node)); Rectangle rect = tree.getPathBounds(path); if (rect != null) { tree.repaint(rect); } } return (flags & (ALLBITS | ABORT)) == 0; }}public static void main(String args[]) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} AnimatedIconTreeExample frame = new AnimatedIconTreeExample(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setSize(280, 200); frame.setVisible(true);}}class IconNodeRenderer 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); Icon icon = ((IconNode) value).getIcon(); if (icon == null) { Hashtable icons = (Hashtable) tree.getClientProperty("title4.gif"); String name = ((IconNode) value).getIconName(); if ((icons != null) && (name != null)) { icon = (Icon) icons.get(name); if (icon != null) { setIcon(icon); } } } else { setIcon(icon); } return this;}}class IconNode extends DefaultMutableTreeNode {protected Icon icon;protected String iconName;public IconNode() { this(null);}public IconNode(Object userObject) { this(userObject, true, null);}public IconNode(Object userObject, boolean allowsChildren, Icon icon) { super(userObject, allowsChildren); this.icon = icon;}public void setIcon(Icon icon) { this.icon = icon;}public Icon getIcon() { return icon;}public String getIconName() { if (iconName != null) { return iconName; } else { String str = userObject.toString(); int index = str.lastIndexOf("."); if (index != -1) { return str.substring(++index); } else { return null; } }}public void setIconName(String name) { iconName = name;}}
页:
[1]