Java/Swing JFC/Tree Renderer Editor
Содержание
Build a tree and populate it with custom renderers and editors
<source lang="java">
/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O"Reilly
- /
// EmailTree.java //A Simple test to see how we can build a tree and populate it. This //application also uses custom renderers and editors. // import java.awt.BorderLayout; import java.awt.ruponent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.util.EventObject; import java.util.Hashtable; import java.util.Vector; import javax.swing.CellEditor; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellEditor; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeCellEditor; public class EmailTree extends JFrame {
JTree tree; String[][] addresses = { { "paul@work.domain", "ptw@work.domain", "other@volunteer.domain" }, { "paul@home.domain" }, { "damian@work.domain", "damian@bigisp.domain" }, { "paged@pager.domain" }, { "damian@home.domain", "mosh@home.domain" }, { "angela@home.ru" } }; public EmailTree() { super("Hashtable Test"); setSize(400, 300); setDefaultCloseOperation(EXIT_ON_CLOSE); // 1.3 & higher // addWindowListener(new BasicWindowMonitor()); // 1.1 & 1.2 } public void init() { Hashtable h = new Hashtable(); Hashtable paul = new Hashtable(); paul.put("Work", addresses[0]); paul.put("Home", addresses[1]); Hashtable damian = new Hashtable(); damian.put("Work", addresses[2]); damian.put("Pager", addresses[3]); damian.put("Home", addresses[4]); Hashtable angela = new Hashtable(); angela.put("Home", addresses[5]); h.put("Paul", paul); h.put("Damian", damian); h.put("Angela", angela); tree = new JTree(h); DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree .getCellRenderer(); renderer.setOpenIcon(new ImageIcon("mailboxdown.gif")); renderer.setClosedIcon(new ImageIcon("mailboxup.gif")); renderer.setLeafIcon(new ImageIcon("letter.gif")); EmailTreeCellEditor emailEditor = new EmailTreeCellEditor(); DefaultTreeCellEditor editor = new DefaultTreeCellEditor(tree, renderer, emailEditor); tree.setCellEditor(editor); tree.setEditable(true); getContentPane().add(tree, BorderLayout.CENTER); } public static void main(String args[]) { EmailTree tt = new EmailTree(); tt.init(); tt.setVisible(true); }
} //EmailTreeCellEditor.java //An editor that actually manages two separate editors: one for folders //(nodes) that uses a combobox; and one for files (leaves) that uses a //textfield. // class EmailTreeCellEditor implements TreeCellEditor {
EditorComboBox nodeEditor; EmailEditor leafEditor; CellEditor currentEditor; static String[] emailTypes = { "Home", "Work", "Pager", "Spam" }; public EmailTreeCellEditor() { EmailEditor tf = new EmailEditor(); EditorComboBox cb = new EditorComboBox(emailTypes); nodeEditor = cb; leafEditor = tf; } public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) { if (leaf) { currentEditor = leafEditor; leafEditor.setText(value.toString()); } else { currentEditor = nodeEditor; nodeEditor.setSelectedItem(((DefaultMutableTreeNode) value) .getUserObject()); } return (Component) currentEditor; } public Object getCellEditorValue() { return currentEditor.getCellEditorValue(); } // All cells are editable in this example... public boolean isCellEditable(EventObject event) { return true; } public boolean shouldSelectCell(EventObject event) { return currentEditor.shouldSelectCell(event); } public boolean stopCellEditing() { return currentEditor.stopCellEditing(); } public void cancelCellEditing() { currentEditor.cancelCellEditing(); } public void addCellEditorListener(CellEditorListener l) { nodeEditor.addCellEditorListener(l); leafEditor.addCellEditorListener(l); } public void removeCellEditorListener(CellEditorListener l) { nodeEditor.removeCellEditorListener(l); leafEditor.removeCellEditorListener(l); }
} //EditorComboBox.java //A CellEditor JComboBox subclass for use with Trees (and possibly tables). //This version will work with any list of values passed as an Object[]. // class EditorComboBox extends JComboBox implements CellEditor {
String value; Vector listeners = new Vector(); // Mimic all the constructors people expect with ComboBoxes. public EditorComboBox(Object[] list) { super(list); setEditable(false); value = list[0].toString(); // Listen to our own action events so that we know when to stop editing. addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { if (stopCellEditing()) { fireEditingStopped(); } } }); } // Implement the CellEditor methods. public void cancelCellEditing() { } // Stop editing only if the user entered a valid value. public boolean stopCellEditing() { try { value = (String) getSelectedItem(); if (value == null) { value = (String) getItemAt(0); } return true; } catch (Exception e) { // Something went wrong. return false; } } public Object getCellEditorValue() { return value; } // Start editing when the right mouse button is clicked. public boolean isCellEditable(EventObject eo) { if ((eo == null) || ((eo instanceof MouseEvent) && (((MouseEvent) eo) .isMetaDown()))) { return true; } return false; } public boolean shouldSelectCell(EventObject eo) { return true; } // Add support for listeners. public void addCellEditorListener(CellEditorListener cel) { listeners.addElement(cel); } public void removeCellEditorListener(CellEditorListener cel) { listeners.removeElement(cel); } protected void fireEditingStopped() { if (listeners.size() > 0) { ChangeEvent ce = new ChangeEvent(this); for (int i = listeners.size() - 1; i >= 0; i--) { ((CellEditorListener) listeners.elementAt(i)) .editingStopped(ce); } } }
} //EmailEditor.java //An extension of JTextField that requires an "@" somewhere in the field. //Meant to be used as a cell editor within a JTable or JTree. // class EmailEditor extends JTextField implements CellEditor {
String value = ""; Vector listeners = new Vector(); // Mimic all the constructors people expect with text fields. public EmailEditor() { this("", 5); } public EmailEditor(String s) { this(s, 5); } public EmailEditor(int w) { this("", w); } public EmailEditor(String s, int w) { super(s, w); // Listen to our own action events so that we know when to stop editing. addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { if (stopCellEditing()) { fireEditingStopped(); } } }); } // Implement the CellEditor methods. public void cancelCellEditing() { setText(""); } // Stop editing only if the user entered a valid value. public boolean stopCellEditing() { try { String tmp = getText(); int at = tmp.indexOf("@"); if (at != -1) { value = tmp; return true; } return false; } catch (Exception e) { // Something went wrong (most likely we don"t have a valid integer). return false; } } public Object getCellEditorValue() { return value; } // Start editing when the right mouse button is clicked. public boolean isCellEditable(EventObject eo) { if ((eo == null) || ((eo instanceof MouseEvent) && (((MouseEvent) eo) .isMetaDown()))) { return true; } return false; } public boolean shouldSelectCell(EventObject eo) { return true; } // Add support for listeners. public void addCellEditorListener(CellEditorListener cel) { listeners.addElement(cel); } public void removeCellEditorListener(CellEditorListener cel) { listeners.removeElement(cel); } protected void fireEditingStopped() { if (listeners.size() > 0) { ChangeEvent ce = new ChangeEvent(this); for (int i = listeners.size() - 1; i >= 0; i--) { ((CellEditorListener) listeners.elementAt(i)) .editingStopped(ce); } } }
}
</source>
CheckBox Node Tree Sample
<source lang="java">
/* Definitive Guide to Swing for Java 2, Second Edition By John Zukowski ISBN: 1-893115-78-X Publisher: APress
- /
import java.awt.BorderLayout; import java.awt.Color; import java.awt.ruponent; import java.awt.Font; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseEvent; import java.util.EventObject; import java.util.Vector; import javax.swing.AbstractCellEditor; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeCellEditor; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreePath; public class CheckBoxNodeTreeSample {
public static void main(String args[]) { JFrame frame = new JFrame("CheckBox Tree"); CheckBoxNode accessibilityOptions[] = { new CheckBoxNode( "Move system caret with focus/selection changes", false), new CheckBoxNode("Always expand alt text for images", true) }; CheckBoxNode browsingOptions[] = { new CheckBoxNode("Notify when downloads complete", true), new CheckBoxNode("Disable script debugging", true), new CheckBoxNode("Use AutoComplete", true), new CheckBoxNode("Browse in a new process", false) }; Vector accessVector = new NamedVector("Accessibility", accessibilityOptions); Vector browseVector = new NamedVector("Browsing", browsingOptions); Object rootNodes[] = { accessVector, browseVector }; Vector rootVector = new NamedVector("Root", rootNodes); JTree tree = new JTree(rootVector); CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer(); tree.setCellRenderer(renderer); tree.setCellEditor(new CheckBoxNodeEditor(tree)); tree.setEditable(true); JScrollPane scrollPane = new JScrollPane(tree); frame.getContentPane().add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
} class CheckBoxNodeRenderer implements TreeCellRenderer {
private JCheckBox leafRenderer = new JCheckBox(); private DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer(); Color selectionBorderColor, selectionForeground, selectionBackground, textForeground, textBackground; protected JCheckBox getLeafRenderer() { return leafRenderer; } public CheckBoxNodeRenderer() { Font fontValue; fontValue = UIManager.getFont("Tree.font"); if (fontValue != null) { leafRenderer.setFont(fontValue); } Boolean booleanValue = (Boolean) UIManager .get("Tree.drawsFocusBorderAroundIcon"); leafRenderer.setFocusPainted((booleanValue != null) && (booleanValue.booleanValue())); selectionBorderColor = UIManager.getColor("Tree.selectionBorderColor"); selectionForeground = UIManager.getColor("Tree.selectionForeground"); selectionBackground = UIManager.getColor("Tree.selectionBackground"); textForeground = UIManager.getColor("Tree.textForeground"); textBackground = UIManager.getColor("Tree.textBackground"); } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { Component returnValue; if (leaf) { String stringValue = tree.convertValueToText(value, selected, expanded, leaf, row, false); leafRenderer.setText(stringValue); leafRenderer.setSelected(false); leafRenderer.setEnabled(tree.isEnabled()); if (selected) { leafRenderer.setForeground(selectionForeground); leafRenderer.setBackground(selectionBackground); } else { leafRenderer.setForeground(textForeground); leafRenderer.setBackground(textBackground); } if ((value != null) && (value instanceof DefaultMutableTreeNode)) { Object userObject = ((DefaultMutableTreeNode) value) .getUserObject(); if (userObject instanceof CheckBoxNode) { CheckBoxNode node = (CheckBoxNode) userObject; leafRenderer.setText(node.getText()); leafRenderer.setSelected(node.isSelected()); } } returnValue = leafRenderer; } else { returnValue = nonLeafRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); } return returnValue; }
} class CheckBoxNodeEditor extends AbstractCellEditor implements TreeCellEditor {
CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer(); ChangeEvent changeEvent = null; JTree tree; public CheckBoxNodeEditor(JTree tree) { this.tree = tree; } public Object getCellEditorValue() { JCheckBox checkbox = renderer.getLeafRenderer(); CheckBoxNode checkBoxNode = new CheckBoxNode(checkbox.getText(), checkbox.isSelected()); return checkBoxNode; } public boolean isCellEditable(EventObject event) { boolean returnValue = false; if (event instanceof MouseEvent) { MouseEvent mouseEvent = (MouseEvent) event; TreePath path = tree.getPathForLocation(mouseEvent.getX(), mouseEvent.getY()); if (path != null) { Object node = path.getLastPathComponent(); if ((node != null) && (node instanceof DefaultMutableTreeNode)) { DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) node; Object userObject = treeNode.getUserObject(); returnValue = ((treeNode.isLeaf()) && (userObject instanceof CheckBoxNode)); } } } return returnValue; } public Component getTreeCellEditorComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row) { Component editor = renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf, row, true); // editor always selected / focused ItemListener itemListener = new ItemListener() { public void itemStateChanged(ItemEvent itemEvent) { if (stopCellEditing()) { fireEditingStopped(); } } }; if (editor instanceof JCheckBox) { ((JCheckBox) editor).addItemListener(itemListener); } return editor; }
} class CheckBoxNode {
String text; boolean selected; public CheckBoxNode(String text, boolean selected) { this.text = text; this.selected = selected; } public boolean isSelected() { return selected; } public void setSelected(boolean newValue) { selected = newValue; } public String getText() { return text; } public void setText(String newValue) { text = newValue; } public String toString() { return getClass().getName() + "[" + text + "/" + selected + "]"; }
} class NamedVector extends Vector {
String name; public NamedVector(String name) { this.name = name; } public NamedVector(String name, Object elements[]) { this.name = name; for (int i = 0, n = elements.length; i < n; i++) { add(elements[i]); } } public String toString() { return "[" + name + "]"; }
}
</source>
Combobox Tree Node Editor
<source lang="java">
import java.awt.BorderLayout; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellEditor; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeCellEditor; public class ComboTreeSample {
public static void main(String args[]) { JFrame frame = new JFrame("Editable Tree"); JTree tree = new JTree(); tree.setEditable(true); DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree .getCellRenderer(); String elements[] = { "Root", "chartreuse", "rugby", "sushi" }; JComboBox comboBox = new JComboBox(elements); comboBox.setEditable(true); TreeCellEditor comboEditor = new DefaultCellEditor(comboBox); TreeCellEditor editor = new DefaultTreeCellEditor(tree, renderer, comboEditor); tree.setCellEditor(editor); JScrollPane scrollPane = new JScrollPane(tree); frame.getContentPane().add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}
</source>
extends DefaultTreeCellEditor to create Tree Leaf editor
<source lang="java">
import java.awt.BorderLayout; import java.util.EventObject; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellEditor; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeCellEditor; import javax.swing.tree.TreeNode; public class EditLeafSample {
public static void main(String args[]) { JFrame frame = new JFrame("Editable Tree"); JTree tree = new JTree(); tree.setEditable(true); DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree .getCellRenderer(); TreeCellEditor editor = new LeafCellEditor(tree, renderer); tree.setCellEditor(editor); JScrollPane scrollPane = new JScrollPane(tree); frame.getContentPane().add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
} class LeafCellEditor extends DefaultTreeCellEditor {
public LeafCellEditor(JTree tree, DefaultTreeCellRenderer renderer) { super(tree, renderer); } public LeafCellEditor(JTree tree, DefaultTreeCellRenderer renderer, TreeCellEditor editor) { super(tree, renderer, editor); } public boolean isCellEditable(EventObject event) { boolean returnValue = super.isCellEditable(event); if (returnValue) { Object node = tree.getLastSelectedPathComponent(); if ((node != null) && (node instanceof TreeNode)) { TreeNode treeNode = (TreeNode) node; returnValue = treeNode.isLeaf(); } } return returnValue; }
}
</source>
Scrollable Table Cell Renderer
<source lang="java">
/*
This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the license, or (at your option) any later version.
- /
import java.awt.Color; import java.awt.ruponent; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Insets; import java.awt.Rectangle; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.Scrollable; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.table.TableCellRenderer;
/**
A TableCellRenderer which is based on an ExtendedJLabel rather than a JLabel like the javax.swing.table.DefaultTableCellRenderer. @author @version $Revision: 1.4 $ $Date: 2003/08/18 07:48:28 $
- /
public class ExtendedTableCellRenderer extends ExtendedJLabel
implements TableCellRenderer { private static final Border NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); private Color unselectedForeground; private Color unselectedBackground; /** * Constructor. */ public ExtendedTableCellRenderer() { super(); setOpaque(true); setBorder(NO_FOCUS_BORDER); } public void setForeground(Color c) { super.setForeground(c); unselectedForeground = c; } public void setBackground(Color c) { super.setBackground(c); unselectedBackground = c; } public void updateUI() { super.updateUI(); setForeground(null); setBackground(null); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { super.setForeground(table.getSelectionForeground()); super.setBackground(table.getSelectionBackground()); } else { super.setForeground((unselectedForeground != null) ? unselectedForeground : table.getForeground()); super.setBackground((unselectedBackground != null) ? unselectedBackground : table.getBackground()); } setFont(table.getFont()); if (hasFocus) { setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); if (table.isCellEditable(row, column)) { super.setForeground(UIManager.getColor("Table.focusCellForeground")); super.setBackground(UIManager.getColor("Table.focusCellBackground")); } } else { setBorder(NO_FOCUS_BORDER); } setValue(value); Color background = getBackground(); boolean colorMatch = (background != null) && (background.equals(table.getBackground())) && table.isOpaque(); setOpaque(!colorMatch); return this; } public void validate() {} public void revalidate() {} public void repaint(long tm, int x, int y, int width, int height) {} public void repaint(Rectangle r) { } protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { if (propertyName == "text") { super.firePropertyChange(propertyName, oldValue, newValue); } } public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) { }
private void setValue(Object value) { setText((value == null) ? "" : value.toString()); }
}
/*
This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the license, or (at your option) any later version.
- /
class ExtendedJLabel extends JLabel implements Scrollable { private boolean underlined = false; private boolean autoTooltip = false; /** Constructor. */ public ExtendedJLabel() { } /** Constructor. @param text the label text. */ public ExtendedJLabel(String text) { super(text); } public Dimension getPreferredScrollableViewportSize() { return getSize(); } public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return getWidth() / 10; } public boolean getScrollableTracksViewportWidth() { return false; } public boolean getScrollableTracksViewportHeight() { return false; } public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { return 10; } /** Check whether this label is underlined. @return underlined or not */ public boolean isUnderlined() { return underlined; } /** Set whether this label is underlined. @param underlined underlined or not */ public void setUnderlined(boolean underlined) { this.underlined = underlined; repaint(); } /** Check whether the tooltip text is automatically equal to the text of this label or not. @return equal or not */ public boolean getAutoTooltip() { return autoTooltip; } /** Set whether the tooltip text is automatically equal to the text of this label or not. @param autoTooltip equal or not */ public void setAutoTooltip(boolean autoTooltip) { this.autoTooltip = autoTooltip; setToolTipText(getText()); } public void setText(String text) { super.setText(text); if (autoTooltip) { setToolTipText(text); } } /** Convenience method for calling setText() with a short. @param number the short */ public void setText(short number) { setText(String.valueOf(number)); } /** Convenience method for calling setText() with a int. @param number the int */ public void setText(int number) { setText(String.valueOf(number)); } /** Convenience method for calling setText() with a double. @param number the double */ public void setText(double number) { setText(String.valueOf(number)); } /** Convenience method for calling setText() with a float. @param number the float */ public void setText(float number) { setText(String.valueOf(number)); } /** Convenience method for calling setText() with a long. @param number the long */ public void setText(long number) { setText(String.valueOf(number)); } public void paint(Graphics g) { super.paint(g); if (underlined) { Insets i = getInsets(); FontMetrics fm = g.getFontMetrics(); Rectangle textRect = new Rectangle(); Rectangle viewRect = new Rectangle(i.left, i.top, getWidth() - (i.right + i.left), getHeight() - (i.bottom + i.top) ); SwingUtilities.layoutCompoundLabel( this, fm, getText(), getIcon(), getVerticalAlignment(), getHorizontalAlignment(), getVerticalTextPosition(), getHorizontalTextPosition(), viewRect, new Rectangle(), textRect, getText() == null ? 0 : ((Integer)UIManager.get("Button.textIconGap")).intValue() );
int offset = 2; if (UIManager.getLookAndFeel().isNativeLookAndFeel() && System.getProperty("os.name").startsWith("Windows")) { offset = 1; } g.fillRect(textRect.x + ((Integer)UIManager.get("Button.textShiftOffset")).intValue() , textRect.y + fm.getAscent() + ((Integer)UIManager.get("Button.textShiftOffset")).intValue() + offset, textRect.width, 1); } }
}
</source>
Tree Cell Renderer
<source lang="java">
/* Definitive Guide to Swing for Java 2, Second Edition By John Zukowski ISBN: 1-893115-78-X Publisher: APress
- /
import java.awt.BorderLayout; import java.awt.Color; import java.awt.ruponent; import java.awt.GridLayout; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeCellRenderer; public class BookTree {
public static void main(String args[]) { JFrame frame = new JFrame("Book Tree"); Book javaBooks[] = { new Book("Core Java 2 Fundamentals", "Cornell/Horstmann", 42.99f), new Book("Taming Java Threads", "Holub", 34.95f), new Book("JavaServer Pages", "Pekowsky", 39.95f) }; Book htmlBooks[] = { new Book("Dynamic HTML", "Goodman", 39.95f), new Book("HTML 4 Bible", "Pfaffenberger/Gutzman", 49.99f) }; Vector javaVector = new NamedVector("Java Books", javaBooks); Vector htmlVector = new NamedVector("HTML Books", htmlBooks); Object rootNodes[] = { javaVector, htmlVector }; Vector rootVector = new NamedVector("Root", rootNodes); JTree tree = new JTree(rootVector); TreeCellRenderer renderer = new BookCellRenderer(); tree.setCellRenderer(renderer); JScrollPane scrollPane = new JScrollPane(tree); frame.getContentPane().add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 300); frame.setVisible(true); }
} class Book {
String title; String authors; float price; public Book(String title, String authors, float price) { this.title = title; this.authors = authors; this.price = price; } public String getTitle() { return title; } public String getAuthors() { return authors; } public float getPrice() { return price; }
} class BookCellRenderer implements TreeCellRenderer {
JLabel titleLabel; JLabel authorsLabel; JLabel priceLabel; JPanel renderer; DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer(); Color backgroundSelectionColor; Color backgroundNonSelectionColor; public BookCellRenderer() { renderer = new JPanel(new GridLayout(0, 1)); titleLabel = new JLabel(" "); titleLabel.setForeground(Color.blue); renderer.add(titleLabel); authorsLabel = new JLabel(" "); authorsLabel.setForeground(Color.blue); renderer.add(authorsLabel); priceLabel = new JLabel(" "); priceLabel.setHorizontalAlignment(JLabel.RIGHT); priceLabel.setForeground(Color.red); renderer.add(priceLabel); renderer.setBorder(BorderFactory.createLineBorder(Color.black)); backgroundSelectionColor = defaultRenderer .getBackgroundSelectionColor(); backgroundNonSelectionColor = defaultRenderer .getBackgroundNonSelectionColor(); } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { Component returnValue = null; if ((value != null) && (value instanceof DefaultMutableTreeNode)) { Object userObject = ((DefaultMutableTreeNode) value) .getUserObject(); if (userObject instanceof Book) { Book book = (Book) userObject; titleLabel.setText(book.getTitle()); authorsLabel.setText(book.getAuthors()); priceLabel.setText("" + book.getPrice()); if (selected) { renderer.setBackground(backgroundSelectionColor); } else { renderer.setBackground(backgroundNonSelectionColor); } renderer.setEnabled(tree.isEnabled()); returnValue = renderer; } } if (returnValue == null) { returnValue = defaultRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); } return returnValue; }
} class NamedVector extends Vector {
String name; public NamedVector(String name) { this.name = name; } public NamedVector(String name, Object elements[]) { this.name = name; for (int i = 0, n = elements.length; i < n; i++) { add(elements[i]); } } public String toString() { return "[" + name + "]"; }
}
</source>
Tree Changed Renderer
<source lang="java">
/* Definitive Guide to Swing for Java 2, Second Edition By John Zukowski ISBN: 1-893115-78-X Publisher: APress
- /
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; public class TreeChangedRenderer {
public static void main(String args[]) { JFrame frame = new JFrame("Changed Renderer"); JTree tree = new JTree(); DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree .getCellRenderer(); renderer.setFont(new Font("Dialog", Font.BOLD | Font.ITALIC, 32)); int rowHeight = tree.getRowHeight(); if (rowHeight <= 0) { tree.setRowHeight(rowHeight - 1); } // Swap background colors Color backgroundSelection = renderer.getBackgroundSelectionColor(); renderer.setBackgroundSelectionColor(renderer .getBackgroundNonSelectionColor()); renderer.setBackgroundNonSelectionColor(backgroundSelection); // Swap text colors Color textSelection = renderer.getTextSelectionColor(); renderer.setTextSelectionColor(renderer.getTextNonSelectionColor()); renderer.setTextNonSelectionColor(textSelection); JScrollPane scrollPane = new JScrollPane(tree); frame.getContentPane().add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}
</source>
Using DefaultTreeCellRenderer
<source lang="java">
import java.awt.Color; import java.awt.Dimension; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; public class Main extends JFrame {
private JTree m_simpleTree; private DefaultMutableTreeNode m_rootNode; public Main() { m_rootNode = new DefaultMutableTreeNode("A"); DefaultMutableTreeNode enggNode = new DefaultMutableTreeNode("B"); DefaultMutableTreeNode markNode = new DefaultMutableTreeNode("C"); DefaultMutableTreeNode hrNode = new DefaultMutableTreeNode("D"); m_rootNode.add(enggNode); m_rootNode.add(markNode); m_rootNode.add(hrNode); m_simpleTree = new JTree(m_rootNode); DefaultTreeCellRenderer cellRenderer = (DefaultTreeCellRenderer) m_simpleTree.getCellRenderer(); cellRenderer.setOpenIcon(new ImageIcon("open.gif")); cellRenderer.setClosedIcon(new ImageIcon("closed.gif")); cellRenderer.setLeafIcon(new ImageIcon("leaf.gif")); cellRenderer.setBackgroundNonSelectionColor(new Color(255, 255, 221)); cellRenderer.setBackgroundSelectionColor(new Color(0, 0, 128)); cellRenderer.setBorderSelectionColor(Color.black); cellRenderer.setTextSelectionColor(Color.white); cellRenderer.setTextNonSelectionColor(Color.blue); JScrollPane scrollPane = new JScrollPane(m_simpleTree); add(scrollPane); } public static void main(String[] arg) { Main m = new Main(); m.setVisible(true); m.setSize(new Dimension(450, 300)); m.validate(); }
}
</source>