JTree 具有不同颜色的树线?

发布于 2024-11-26 03:00:02 字数 115 浏览 2 评论 0 原文

两个兄弟节点之间是否可以有不同颜色的树线?

我想表明这两个节点是通过一条蓝线连接起来的。然而,整个JTree默认颜色是灰色或黑色斜线。某些节点之间是否可以有部分不同颜色的线?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

战皆罪 2024-12-03 03:00:02

要更改树中线条的颜色,您需要子类 BasicTreeUI 并至少重写 4 个方法:

扩展 BasicTreeUI 的示例 可以在这里找到

To change the colours of the lines in the tree, you will need to subclass BasicTreeUI and override at least the 4 methods:

An example of extending BasicTreeUI can be found here

贪恋 2024-12-03 03:00:02

或许

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

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() {
    }
}
凯凯我们等你回来 2024-12-03 03:00:02

您必须使用 TreeCellRenderer 适合您的需求。

You must use a TreeCellRenderer that suits your needs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文