Дерево с разноцветными линиями деревьев? - PullRequest
3 голосов
/ 25 июля 2011

возможно ли иметь разноцветные линии деревьев между двумя узлами-братьями?

Я хочу показать, что эти два узла связаны синей линией, соединяющей их. Однако весь цвет по умолчанию JTree представляет собой серую или черную угловую линию. Возможно ли иметь частично разные цветные линии между определенными узлами?

Ответы [ 3 ]

6 голосов
/ 25 июля 2011

Чтобы изменить цвета линий в дереве, вам нужно создать подкласс BasicTreeUI и переопределить как минимум 4 метода:

Примеррасширения BasicTreeUI можно найти здесь

2 голосов
/ 25 июля 2011

может быть

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() {
    }
}
1 голос
/ 25 июля 2011

Вы должны использовать TreeCellRenderer , который соответствует вашим потребностям.

...