Java Tutorial/Swing/JTree Editor Renderer
Содержание
- 1 Changing and Removing the Default Icons in a JTree Component
- 2 Creating a Custom Renderer
- 3 Creating a DefaultCellEditor: JCheckBox
- 4 Creating a DefaultCellEditor: JComboBox
- 5 Creating a DefaultCellEditor: JTextField
- 6 Creating an Editor Just for Leaf Nodes
- 7 Creating a Proper ComboBox Editor for a Tree
- 8 Editing Tree Nodes with triple clicking
- 9 extends JLabel implements TreeCellRenderer
- 10 Flush the internal cache of Row height
- 11 Getting Default TreeCellRenderer From JTree
- 12 Rendering an image in a JTable column
- 13 Setting the Activation Click Count for a Table Cell Editor in a JTable Component
- 14 Use UIManager to change the default icon for JTree
- 15 Using DefaultTreeCellRenderer
- 16 Working with Tree Tooltips: using a Tooltip Cell Renderer
Changing and Removing the Default Icons in a JTree Component
<source lang="java">
import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.UIManager; import javax.swing.tree.DefaultTreeCellRenderer; public class Main {
public static void main(String[] argv) throws Exception { Icon leafIcon = new ImageIcon("leaf.gif"); Icon openIcon = new ImageIcon("open.gif"); Icon closedIcon = new ImageIcon("closed.gif"); JTree tree = new JTree(); DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree.getCellRenderer(); renderer.setLeafIcon(leafIcon); renderer.setClosedIcon(closedIcon); renderer.setOpenIcon(openIcon);
JFrame f = new JFrame(); f.add(new JScrollPane(tree)); f.setSize(300, 300); f.setVisible(true); }
}</source>
Creating a Custom Renderer
<source lang="java">
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; class TreeNodeVector<E> extends Vector<E> {
String name; TreeNodeVector(String name) { this.name = name; } TreeNodeVector(String name, E elements[]) { this.name = name; for (int i = 0, n = elements.length; i < n; i++) { add(elements[i]); } } public String toString() { return "[" + name + "]"; }
} class Employee {
public String firstName; public String lastName; public float salary; public Employee(String f, String l, float s) { this.firstName = f; this.lastName = l; this.salary = s; }
} class EmployeeCellRenderer implements TreeCellRenderer {
JLabel firstNameLabel = new JLabel(" "); JLabel lastNameLabel = new JLabel(" "); JLabel salaryLabel = new JLabel(" "); JPanel renderer = new JPanel(); DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer(); Color backgroundSelectionColor; Color backgroundNonSelectionColor; public EmployeeCellRenderer() { firstNameLabel.setForeground(Color.BLUE); renderer.add(firstNameLabel); lastNameLabel.setForeground(Color.BLUE); renderer.add(lastNameLabel); salaryLabel.setHorizontalAlignment(JLabel.RIGHT); salaryLabel.setForeground(Color.RED); renderer.add(salaryLabel); 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 Employee) { Employee e = (Employee) userObject; firstNameLabel.setText(e.firstName); lastNameLabel.setText(e.lastName); salaryLabel.setText("" + e.salary); 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; }
} public class EmployeeTree {
public static void main(String args[]) { JFrame frame = new JFrame("Book Tree"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Employee javaBooks[] = { new Employee("A", "F", 9.99f), new Employee("B", "E", 4.99f), new Employee("C", "D", 9.95f) }; Employee netBooks[] = { new Employee("AA", "CC", 9.99f), new Employee("BB", "DD", 9.99f) }; Vector<Employee> javaVector = new TreeNodeVector<Employee>("A", javaBooks); Vector<Employee> netVector = new TreeNodeVector<Employee>("As", netBooks); Object rootNodes[] = { javaVector, netVector }; Vector<Object> rootVector = new TreeNodeVector<Object>("Root", rootNodes); JTree tree = new JTree(rootVector); TreeCellRenderer renderer = new EmployeeCellRenderer(); tree.setCellRenderer(renderer); JScrollPane scrollPane = new JScrollPane(tree); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 300); frame.setVisible(true); }
}</source>
Creating a DefaultCellEditor: JCheckBox
<source lang="java">
import java.awt.BorderLayout; import java.util.Properties; import javax.swing.DefaultCellEditor; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.TreeCellEditor; public class TreeEditJCheckBox {
public static void main(String args[]) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Properties props = System.getProperties(); JTree tree = new JTree(props); JCheckBox checkBox = new JCheckBox("To be or not to be"); TreeCellEditor editor = new DefaultCellEditor(checkBox); tree.setEditable(true); tree.setCellEditor(editor); JScrollPane scrollPane = new JScrollPane(tree); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}</source>
Creating a DefaultCellEditor: JComboBox
<source lang="java">
import java.awt.BorderLayout; import java.util.Properties; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.TreeCellEditor; public class TreeEditJComboBox {
public static void main(String args[]) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Properties props = System.getProperties(); JTree tree = new JTree(props); JComboBox comboBox = new JComboBox(new String[]{"A","B","C"}); TreeCellEditor editor = new DefaultCellEditor(comboBox); tree.setEditable(true); tree.setCellEditor(editor); JScrollPane scrollPane = new JScrollPane(tree); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}</source>
Creating a DefaultCellEditor: JTextField
<source lang="java">
import java.awt.BorderLayout; import java.util.Properties; import javax.swing.DefaultCellEditor; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.tree.TreeCellEditor; public class TreeEditJTextField {
public static void main(String args[]) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Properties props = System.getProperties(); JTree tree = new JTree(props); JTextField textField = new JTextField(); TreeCellEditor editor = new DefaultCellEditor(textField); tree.setEditable(true); tree.setCellEditor(editor); JScrollPane scrollPane = new JScrollPane(tree); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}</source>
Creating an Editor Just for Leaf Nodes
<source lang="java">
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.DefaultTreeCellEditor; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeCellEditor; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; class TreeNodeVector<E> extends Vector<E> {
String name; TreeNodeVector(String name) { this.name = name; } TreeNodeVector(String name, E elements[]) { this.name = name; for (int i = 0, n = elements.length; i < n; i++) { add(elements[i]); } } public String toString() { return "[" + name + "]"; }
} class LeafCellEditor extends DefaultTreeCellEditor {
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; }
} 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 CheckBoxNodeRenderer implements TreeCellRenderer {
private JCheckBox leafRenderer = new JCheckBox(); private DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer(); 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())); } 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 ((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); ItemListener itemListener = new ItemListener() { public void itemStateChanged(ItemEvent itemEvent) { if (stopCellEditing()) { fireEditingStopped(); } } }; if (editor instanceof JCheckBox) { ((JCheckBox) editor).addItemListener(itemListener); } return editor; }
} public class CheckBoxNodeTreeSample {
public static void main(String args[]) { JFrame frame = new JFrame("CheckBox Tree"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); CheckBoxNode accessibilityOptions[] = { new CheckBoxNode("A", false), new CheckBoxNode("B", true) }; CheckBoxNode browsingOptions[] = { new CheckBoxNode("C", true), new CheckBoxNode("D", true), new CheckBoxNode("E", true), new CheckBoxNode("F", false) }; Vector<CheckBoxNode> accessVector = new TreeNodeVector<CheckBoxNode>("G", accessibilityOptions); Vector<CheckBoxNode> browseVector = new TreeNodeVector<CheckBoxNode>("H", browsingOptions); Object rootNodes[] = { accessVector, browseVector }; Vector<Object> rootVector = new TreeNodeVector<Object>("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.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}</source>
Creating a Proper ComboBox Editor for a Tree
<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 TreeEdit {
public static void main(String args[]) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Object array[] = {Boolean.TRUE, Boolean.FALSE, "Hello"}; JTree tree = new JTree(array); tree.setEditable(true); tree.setRootVisible(true); DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer(); String elements[] = { "A", "B", "C", "D"} ; 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.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}</source>
Editing Tree Nodes with triple clicking
<source lang="java">
import java.awt.BorderLayout; import java.util.Properties; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; public class TreeEdit {
public static void main(String args[]) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Properties props = System.getProperties(); JTree tree = new JTree(props); tree.setEditable(true); JScrollPane scrollPane = new JScrollPane(tree); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}</source>
extends JLabel implements TreeCellRenderer
<source lang="java">
import java.awt.BorderLayout; import java.awt.ruponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreeModel; public class TreeCellRendererImplementation extends JFrame {
public TreeCellRendererImplementation() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DefaultMutableTreeNode root = new DefaultMutableTreeNode("+"); root.add(new DefaultMutableTreeNode(new Integer(3))); DefaultMutableTreeNode node = new DefaultMutableTreeNode("*"); node.add(new DefaultMutableTreeNode("string")); node.add(new DefaultMutableTreeNode(new Short((short) 5))); root.add(node); TreeModel tm = new DefaultTreeModel(root); JTree tree = new JTree(tm); tree.setShowsRootHandles(true); tree.setCellRenderer(new MyRenderer()); getContentPane().add(tree, BorderLayout.CENTER); setSize(400, 300); setVisible(true); } private class MyRenderer extends JLabel implements TreeCellRenderer { public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected, boolean isExpanded, boolean isLeaf, int row, boolean hasFocus) { Object userObject = ((DefaultMutableTreeNode) value).getUserObject(); setText(value.toString() + " [" + userObject.getClass().getName() + "]"); return this; } } public static void main(String[] args) { TreeCellRendererImplementation m = new TreeCellRendererImplementation(); }
}</source>
Flush the internal cache of Row height
<source lang="java">
import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; public class TreeRowHeightCache {
public static void main(String[] argv) { JTree tree = new JTree(); if (tree.getRowHeight() <= 0) { tree.setRowHeight(1); } tree.setRowHeight(0); JFrame frame = new JFrame("Image"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JScrollPane(tree)); frame.setSize(380, 320); frame.setLocationRelativeTo(null); frame.setVisible(true); }
}</source>
Getting Default TreeCellRenderer From JTree
<source lang="java">
import java.awt.BorderLayout; import java.awt.Color; import java.util.Vector; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; class TreeNodeVector<E> extends Vector<E> {
String name; TreeNodeVector(String name) { this.name = name; } TreeNodeVector(String name, E elements[]) { this.name = name; for (int i = 0, n = elements.length; i < n; i++) { add(elements[i]); } } public String toString() { return "[" + name + "]"; }
} public class ChangingTreeCellRendererBackgroundForegroundColor {
public static void main(final String args[]) { JFrame frame = new JFrame("JTreeSample"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Vector<String> v1 = new TreeNodeVector<String>("Two", new String[] { "Mercury", "Venus", "Mars" }); Vector<Object> v2 = new TreeNodeVector<Object>("Three"); v2.add(System.getProperties()); v2.add(v1); Object rootNodes[] = {v1, v2 }; Vector<Object> rootVector = new TreeNodeVector<Object>("Root", rootNodes); JTree tree = new JTree(rootVector); DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer(); Color backgroundSelection = renderer.getBackgroundSelectionColor(); renderer.setBackgroundSelectionColor(renderer.getBackgroundNonSelectionColor()); renderer.setBackgroundNonSelectionColor(backgroundSelection); Color textSelection = renderer.getTextSelectionColor(); renderer.setTextSelectionColor(renderer.getTextNonSelectionColor()); renderer.setTextNonSelectionColor(textSelection); frame.add(new JScrollPane(tree), BorderLayout.CENTER); frame.setSize(300, 300); frame.setVisible(true); }
}</source>
Rendering an image in a JTable column
<source lang="java">
import java.awt.BorderLayout; import java.awt.ruponent; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; public class Main {
public static void main(String[] args) { JFrame frame = new JFrame(); frame.getContentPane().setLayout(new BorderLayout()); MyTableModel model = new MyTableModel(); JTable table = new JTable(model); table.setRowHeight(80); table.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer()); JScrollPane pane = new JScrollPane(table); frame.getContentPane().add(BorderLayout.CENTER, pane); frame.setSize(500, 400); frame.setVisible(true); }
} class MyTableModel extends AbstractTableModel {
public Object getValueAt(int row, int column) { return "" + (row * column); } public int getColumnCount() { return 4; } public int getRowCount() { return 5; }
} class ImageRenderer extends DefaultTableCellRenderer {
JLabel lbl = new JLabel(); ImageIcon icon = new ImageIcon(getClass().getResource("sample.png")); public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { lbl.setText((String) value); lbl.setIcon(icon); return lbl; }
}</source>
Setting the Activation Click Count for a Table Cell Editor in a JTable Component
<source lang="java">
import java.awt.ruponent; import java.awt.event.MouseEvent; import java.util.EventObject; import javax.swing.AbstractCellEditor; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.TableCellEditor; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { JTable table = new JTable(); TableColumn col = table.getColumnModel().getColumn(0); col.setCellEditor(new MyTableCellEditor()); }
} class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor {
public boolean stopCellEditing() { String s = (String) getCellEditorValue(); return super.stopCellEditing(); } JTextField field = new JTextField(); public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return field; } public boolean isCellEditable(EventObject evt) { if (evt instanceof MouseEvent) { int clickCount; clickCount = 2; return ((MouseEvent)evt).getClickCount() >= clickCount; } return true; } public Object getCellEditorValue() { return null; }
}</source>
Use UIManager to change the default icon for JTree
<source lang="java">
import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.UIManager; public class Main {
public static void main(String[] argv) throws Exception { Icon leafIcon = new ImageIcon("leaf.gif"); Icon openIcon = new ImageIcon("open.gif"); Icon closedIcon = new ImageIcon("closed.gif"); UIManager.put("Tree.leafIcon", leafIcon); UIManager.put("Tree.openIcon", openIcon); UIManager.put("Tree.closedIcon", closedIcon); JTree tree = new JTree(); JFrame f = new JFrame(); f.add(new JScrollPane(tree)); f.setSize(300, 300); f.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>
Working with Tree Tooltips: using a Tooltip Cell Renderer
<source lang="java">
import java.awt.BorderLayout; import java.awt.ruponent; import java.util.Dictionary; import java.util.Properties; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.ToolTipManager; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeCellRenderer; class ToolTipTreeCellRenderer implements TreeCellRenderer {
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); Dictionary tipTable; public ToolTipTreeCellRenderer(Dictionary tipTable) { this.tipTable = tipTable; } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { renderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); if (value != null) { Object tipKey; if (value instanceof DefaultMutableTreeNode) { tipKey = ((DefaultMutableTreeNode) value).getUserObject(); } else { tipKey = tree.convertValueToText(value, selected, expanded, leaf, row, hasFocus); } renderer.setToolTipText((String) tipTable.get(tipKey)); } return renderer; }
} public class TreeTips {
public static void main(String args[]) { JFrame frame = new JFrame("Tree Tips"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Properties props = System.getProperties(); JTree tree = new JTree(props); ToolTipManager.sharedInstance().registerComponent(tree); TreeCellRenderer renderer = new ToolTipTreeCellRenderer(props); tree.setCellRenderer(renderer); JScrollPane scrollPane = new JScrollPane(tree); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}</source>