【问题标题】:JTree with different colored tree lines?具有不同颜色树线的 JTree?
【发布时间】:2011-10-12 10:44:12
【问题描述】:

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

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

【问题讨论】:

    标签: java swing render jtree


    【解决方案1】:

    您必须使用适合您需要的TreeCellRenderer

    【讨论】:

      【解决方案2】:

      要更改树中线条的颜色,您需要继承 BasicTreeUI 并覆盖至少 4 个方法:

      BasicTreeUI扩展示例can be found here

      【讨论】:

        【解决方案3】:

        可能

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

        【讨论】:

          猜你喜欢
          • 2017-02-02
          • 2019-02-20
          • 2019-07-24
          • 1970-01-01
          • 2019-10-09
          • 1970-01-01
          • 2013-10-08
          • 2016-11-15
          • 2014-12-30
          相关资源
          最近更新 更多