Ja ich verwende den selben TreeCellRenderer.
Kann man dann auch mehrere TreeCellRender schreiben und verwenden?
Oder wie realisiere ich das sonst?
Ja Code gibt es, ich poste mal die relevantesten Codeausschnitte:
Zunächst mal den TreeModelListener mit der Methode "treeNodesChanged".
Hier werden meine Wurzel und Unterknoten hinzugefügt.
[code=Java]
public void treeNodesChanged(TreeModelEvent e) {
DefaultMutableTreeNode node;
node = (DefaultMutableTreeNode) (e.getTreePath().getLastPathComponent());
try {
int index = e.getChildIndices()[0];
node = (CheckNode) (node.getChildAt(index));
CheckNode newNode = new CheckNode("New Node");
CheckNode selNode = (CheckNode) tree.getLastSelectedPathComponent();
if (node.toString().equals("Main") && bool1 == true) {
model.insertNodeInto(new CheckNode("Namensraum"), selNode,
selNode.getChildCount());
ja.append("<Main");
model.insertNodeInto(new CheckNode("Element"), selNode, selNode
.getChildCount());
model.insertNodeInto(new CheckNode("Array"), selNode, selNode
.getChildCount());
bool1 = false;
} else if (node.toString().equals("Verfahren1") && bool2 == true) {
model.insertNodeInto(new CheckNode("Array"), selNode, selNode
.getChildCount());
model.insertNodeInto(new CheckNode("AnyXML"), selNode, selNode
.getChildCount());
model.insertNodeInto(new CheckNode("Attribut"), selNode,
selNode.getChildCount());
bool2 = false;
} else if (node.toString().equals("Verfahren2") && bool3 == true) {
model.insertNodeInto(new CheckNode("Element"), selNode, selNode
.getChildCount());
model.insertNodeInto(new CheckNode("Array"), selNode, selNode
.getChildCount());
model.insertNodeInto(new CheckNode("Attribut"), selNode,
selNode.getChildCount());
bool3 = false;
} else
;
TreeNode[] nodes = model.getPathToRoot(newNode);
TreePath path = new TreePath(nodes);
tree.expandPath(path);
tree.scrollPathToVisible(path);
tree.setSelectionPath(path);
tree.startEditingAtPath(path);
tree.revalidate();
tree.repaint();
} catch (NullPointerException exc) {
exc.printStackTrace();
}
}
[/code]
Die Klasse CheckRenderer mit dem TreeCellRenderer:
[code=Java]
class CheckRenderer extends JPanel implements TreeCellRenderer {
protected JCheckBox check;
protected JPanel panel;
protected JLabel label;
protected JTextField t;
protected JPanel getLeafRenderer() {
// leafRendere bearbeiten
return panel;
}
public CheckRenderer() {
setLayout(null);
setUI(null);
add(check = new JCheckBox());
// Hier füge ich das Panel hinzu, jedoch für alle CheckNodes, was ich aber nur für bestimmte Nodes hinzufügen möchte
add(panel = new JPanel());
label = new JLabel("Einstellung");
label.setSize(120, 25);
t = new JTextField("");
t.setSize(100, 25);
// label.setEditable(true);
panel.add(t, BorderLayout.SOUTH);
panel.add(label, BorderLayout.EAST);
panel.setEnabled(true);
panel.setPreferredSize(new Dimension(280, 60));
panel.setBorder(BorderFactory.createEtchedBorder());
panel.setBackground(new Color(245, 255, 245));
panel.setLayout(null);
check.setBackground(Color.WHITE);
}
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean isSelected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
String stringValue = tree.convertValueToText(value, isSelected,
expanded, leaf, row, hasFocus);
setEnabled(tree.isEnabled());
if (isSelected) {
check.setForeground(new Color(255, 155, 55));
check.setBackground(new Color(55, 155, 255));
tree.revalidate();
tree.repaint();
}
check.setSelected(((CheckNode) value).isSelected());
check.setBackground(new Color(245, 245, 245));
panel.setFont(tree.getFont());
tree.setEditable(true);
label.setText(stringValue);
label.setBounds(5, 0, 110, 25);
t.setBounds(5, 30, 100, 25);
t.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (t.getText() != null)
t.setText(t.getText());
check.revalidate();
check.repaint();
}
});
MyTreeModelListener m = new MyTreeModelListener(tree, panel);
return this;
}
}
[/code]