JTree with different colored tree lines?

五迷三道 提交于 2020-01-02 07:57:30

问题


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?


回答1:


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




回答2:


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() {
    }
}



回答3:


You must use a TreeCellRenderer that suits your needs.



来源:https://stackoverflow.com/questions/6814087/jtree-with-different-colored-tree-lines

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!