is it possible to have different colored tree lines between two sibling nodes?
I want to show that these two nodes are linked by having a blue line connecting them. However the entire JTree
default color is grey or black angled line. Is possible to have partially different colored lines between certain nodes?
To change the colours of the lines in the tree, you will need to subclass BasicTreeUI and override at least the 4 methods:
- paintHorizontalLine
- paintHorizontalPartOfLeg
- paintVerticalLine
- paintVerticalPartOfLeg
An example of extending BasicTreeUI can be found here
may be
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
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 TreeNodeVectorA<E> extends Vector<E> {
private static final long serialVersionUID = 1L;
private String name;
TreeNodeVectorA(String name) {
this.name = name;
}
TreeNodeVectorA(String name, E elements[]) {
this.name = name;
for (int i = 0, n = elements.length; i < n; i++) {
add(elements[i]);
}
}
@Override
public String toString() {
return "[" + name + "]";
}
}
class Employee {
public String firstName;
public String lastName;
public float salary;
Employee(String f, String l, float s) {
this.firstName = f;
this.lastName = l;
this.salary = s;
}
}
class EmployeeCellRenderer implements TreeCellRenderer {
private JLabel firstNameLabel = new JLabel(" ");
private JLabel lastNameLabel = new JLabel(" ");
private JLabel salaryLabel = new JLabel(" ");
private JPanel renderer = new JPanel();
private DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
private Color backgroundSelectionColor;
private Color backgroundNonSelectionColor;
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();
}
@Override
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 TreeNodeVectorA<Employee>("A", javaBooks);
Vector<Employee> netVector = new TreeNodeVectorA<Employee>("As", netBooks);
Object rootNodes[] = {javaVector, netVector};
Vector<Object> rootVector = new TreeNodeVectorA<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);
}
private EmployeeTree() {
}
}
You must use a TreeCellRenderer that suits your needs.