自定义TableCellRenderer/TreeTableCellRenderer不呈现表格单元格

dic*_*c19 5 java swing renderer swingx jxtreetable

我把这个CustomCellRenderer类打算用于JXTreeTableJXTable对象,因为我的项目中有很多这些.所以这个类实现TreeCellRendererTableCellRenderer接口:

public class CustomCellRenderer extends JLabel 
                                implements TreeCellRenderer, TableCellRenderer {

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        setBackground(selected ? new Color(83,142,213) : Color.white);
        setForeground(selected ? Color.white : Color.black);
        //here is the icon setting code but it's irrelevant to my problem
        setText(value != null ? value.toString() : "<null>");
        return this;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setBackground(isSelected ? new Color(83,142,213) : Color.white);
        setForeground(isSelected ? Color.white : Color.black);
        setText(value != null ? value.toString() : "<null>");
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我设置渲染器的代码:

jXTreeTableConsumos.setDefaultRenderer(Object.class, new CustomCellRenderer());
jXTreeTableConsumos.setTreeCellRenderer(new CustomCellRenderer());
Run Code Online (Sandbox Code Playgroud)

当选择一行时,我期待背景和前景分别变成蓝色和白色.但是它只发生在树表格单元格(第一列),而只有前景发生变化,而背景仍然是白色,在同一个选定行的其他单元格中:

在此输入图像描述

有人可以告诉我为什么细胞(不是树细胞)不改变它们的背景颜色?

dic*_*c19 7

感谢大家的意见和建议.我在JComponent#setBackground(Color bg)文档中找到了解决方案:

设置此组件的背景颜色.仅当组件不透明时才使用背景颜色,并且仅使用JComponent或ComponentUI实现的子类.JComponent的直接子类必须覆盖paintComponent才能使用此属性.

因为我CustomCellRenderer从我JLabel唯一需要做的事情是确保它是不透明的并且它的背景颜色将被绘制:

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    setOpaque(true);//adding this line I solved my problem
    setBackground(isSelected ? new Color(83,142,213) : Color.white);
    setForeground(isSelected ? Color.white : Color.black);
    setText(value != null ? value.toString() : "<null>");
    return this;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述