Hallo Peter!
Nun, wie ich schon geschrieben habe, änderst Du nur
das Icon des Labels, welches für den Knoten selbst zuständig
ist, nicht aber das Expansionssymbol links von dem Knoten-Icon.
Aber der Ansatz über den TreeCellRenderer ist schon gut.
Um das Expansionssymbol zu setzen muss man von dort an die
Darstellungsklasse des Baums heran:
BasicTreeUI treeUI = (BasicTreeUI)tree.getUI();
Icon icoMinus = (Icon)UIManager.get("Tree.expandedIcon");
treeUI.setCollapsedIcon(icoMinus);
treeUI.setExpandedIcon (icoMinus);
Hier noch ein Demo-Programm dafür:
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Vector;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicTreeUI;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
/\*\*
\* CustomTreeCellRenderer, der
\*
\* @author Andreas Brand
\*/
public class CustomTreeCellRenderer extends DefaultTreeCellRenderer {
/\*\*
\* Erstelle einen neuen CustomTreeCellRenderer
\*/
public CustomTreeCellRenderer() {
super();
}
/\*\*
\* Erzeugt die visuelle Darstellung des übergebenen Baumknotens.
\*
\* @see javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean)
\*/
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
// initialisiere den Renderer:
JLabel com = (JLabel)super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
// fürs Debugging, um zu sehen, was alles zum Knoten-Renderer gehört:
//com.setBorder(BorderFactory.createLineBorder(Color.RED));
BasicTreeUI treeUI = (BasicTreeUI)tree.getUI();
Icon icoPlus = (Icon)UIManager.get("Tree.collapsedIcon");
Icon icoMinus = (Icon)UIManager.get("Tree.expandedIcon");
// TODO: Prüfung, ob der aktuelle Knoten nur unsichtbare Kinder besitzt
// und folgendes Flag korrekt setzen:
boolean blnNodeHasOnlyInvisibleChildren = true;
if( value != null ) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
if( node.getChildCount()\>0 && blnNodeHasOnlyInvisibleChildren) {
// für unsichtbare Kinder immer das Minus-Icon anzeigen:
treeUI.setCollapsedIcon(icoMinus);
treeUI.setExpandedIcon (icoMinus);
}
}
return this;
}
/\*\*
\* Test-Programm für den Renderer.
\*/
public static void main(String[] args) {
JTree tree = new JTree();
tree.setCellRenderer(new CustomTreeCellRenderer());
JFrame frame = new JFrame("Tree Renderer Test");
Container contentPane = frame.getContentPane();
Vector vecIconTypes = new Vector();
vecIconTypes.add("Tree.openIcon");
vecIconTypes.add("Tree.closedIcon");
vecIconTypes.add("Tree.leafIcon");
vecIconTypes.add("Tree.expandedIcon");
vecIconTypes.add("Tree.collapsedIcon");
contentPane.setLayout(new GridBagLayout());
int iXPos = 0;
int iYPos = 0;
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = iXPos;
constraints.gridy = iYPos;
constraints.gridwidth = vecIconTypes.size();
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 1;
constraints.ipadx = 2;
constraints.ipady = 2;
constraints.insets = new Insets(5, 5, 5, 5);
constraints.anchor = GridBagConstraints.WEST;
constraints.fill = GridBagConstraints.BOTH;
contentPane.add(new JScrollPane(tree), constraints);
iYPos++;
constraints = new GridBagConstraints();
constraints.gridx = iXPos;
constraints.gridy = iYPos;
constraints.gridwidth = vecIconTypes.size();
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 0;
constraints.ipadx = 2;
constraints.ipady = 2;
constraints.insets = new Insets(5, 5, 5, 5);
constraints.anchor = GridBagConstraints.WEST;
constraints.fill = GridBagConstraints.HORIZONTAL;
contentPane.add(new JLabel("Die UI-Klasse '" + tree.getUI().getClass().getName() + "' des Baums verwendet die folgenden Standard-Icons:"), constraints);
iYPos++;
for (int i=0; i
Damit wäre das Ursprungsproblem nun hoffentlich gelöst :wink:
Gruß,
-Andreas.