当前位置: 代码迷 >> java >> 基于级别的JTree DefaultTreeCellRenderer颜色
  详细解决方案

基于级别的JTree DefaultTreeCellRenderer颜色

热度:108   发布时间:2023-07-26 14:50:51.0

我正在扩展DefaultTreeCellRenderer以便根据级别绘制Node背景,但是我目前只能获取当前行而不是当前级别。

如何在getTreeCellRendererComponent(JTree aTree,Object aValue,boolean aSelected,boolean aExpanded,boolean aLeaf,int aRow,boolean aHasFocus)函数中获取当前级别?

在下面的实例中,我只能基于行来替换节点的背景,如何在树上获取级别,如果level == 1,则将背景设置为黄色?

import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;

public class Testing
{
    public void buildGUI()
    {
        final MyJTree tree = new MyJTree();
        JFrame f = new JFrame();
        f.getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
        f.setSize(200, 200);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Testing().buildGUI();
            }
        });
    }
}

class MyJTree extends JTree
{
    public MyJTree()
    {
        super();
        setCellRenderer(new NiceTreeCellRenderer());
    }
}

class NiceTreeCellRenderer extends DefaultTreeCellRenderer
{

    DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();

    @Override
    public Component getTreeCellRendererComponent(JTree aTree, Object aValue, boolean aSelected,
            boolean aExpanded, boolean aLeaf, int aRow, boolean aHasFocus)
    {
        JPanel panel = new JPanel(); // Create a new panel where we will show the data.
        String text = (String) ((DefaultMutableTreeNode) aValue).getUserObject();
        panel.add(new JLabel(text)); // Actually show the data.

        // If the value is not null and is a tree node and a leaf then paint it.
        if ((aValue != null) && (aValue instanceof DefaultMutableTreeNode) && aLeaf)
        {
                if (aRow % 2 == 0)
                {
                    panel.setBackground(Color.WHITE);
                }
                else
                {
                    panel.setBackground(new Color(230, 230, 230));
                }
            panel.setEnabled(aTree.isEnabled());
            return panel;
        }
        // For everything else use default renderer.
        return defaultRenderer.getTreeCellRendererComponent(aTree, aValue, aSelected, aExpanded, aLeaf,
                aRow, aHasFocus);
    }
}

使用