Java 已调用自定义CellRenderer,但似乎没有效果

Java 已调用自定义CellRenderer,但似乎没有效果,java,swing,jtree,tablecellrenderer,cellrenderer,Java,Swing,Jtree,Tablecellrenderer,Cellrenderer,简单地说:为什么下面的小示例不在树控件的第三项上显示浅灰色背景 代码创建一个JTree,用三个字符串(直接传递给构造函数)填充它,并重写getCellRenderer()方法以返回自定义MyTreeCellRenderer类的实例,该类具有硬编码检查以将第2行上任何单元格的背景色设置为浅灰色。但当运行时,所有单元格都只有常规(白色)背景色 import java.awt.Color; import java.awt.Component; import javax.swing.JFrame; i

简单地说:为什么下面的小示例不在树控件的第三项上显示浅灰色背景

代码创建一个JTree,用三个字符串(直接传递给构造函数)填充它,并重写getCellRenderer()方法以返回自定义MyTreeCellRenderer类的实例,该类具有硬编码检查以将第2行上任何单元格的背景色设置为浅灰色。但当运行时,所有单元格都只有常规(白色)背景色

import java.awt.Color;
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;

@SuppressWarnings("serial")
public class MainFrame extends JFrame {

    public MainFrame() {
        final MyTreeCellRenderer treeRenderer = new MyTreeCellRenderer();
        JTree tree = new JTree(new Object[] { "First", "Second", "Third" }) {
            @Override
            public TreeCellRenderer getCellRenderer() {
                return treeRenderer;
            }
        };
        tree.setRootVisible(false);

        add(tree);

        setSize(400, 300);
        setVisible(true);
    }

    public class MyTreeCellRenderer extends DefaultTreeCellRenderer {
        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
            Component c = super.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, hasFocus);
            if (row == 2) {
                c.setBackground(Color.LIGHT_GRAY);
            } else {
                c.setBackground(Color.WHITE);
            }
            return c;
        }
    }

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

}

DefaultTreeCellRenderer
,的子类,必须是才能显示颜色

JComponent c = (JComponent) super.getTreeCellRendererComponent(tree,
    value,isSelected, expanded, leaf, row, hasFocus);
c.setOpaque(true);


不使用默认选择模型
JTable
JList
的原因是什么?在完整的应用程序中,存在一对多关系(因此在一个视图中选择一个对象可能会导致在另一个视图中出现多个突出显示),我不想让它们进行多选。+1。太好了,谢谢你的回答。奇怪的是,我读过这篇文章,但不知怎么的,并没有把它和我的问题联系起来。。。