dic*_*c19 5 java swing renderer swingx jxtreetable
我把这个CustomCellRenderer类打算用于JXTreeTable和JXTable对象,因为我的项目中有很多这些.所以这个类实现TreeCellRenderer和TableCellRenderer接口:
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;
    }
}
这是我设置渲染器的代码:
jXTreeTableConsumos.setDefaultRenderer(Object.class, new CustomCellRenderer());
jXTreeTableConsumos.setTreeCellRenderer(new CustomCellRenderer());
当选择一行时,我期待背景和前景分别变成蓝色和白色.但是它只发生在树表格单元格(第一列),而只有前景发生变化,而背景仍然是白色,在同一个选定行的其他单元格中:

有人可以告诉我为什么细胞(不是树细胞)不改变它们的背景颜色?
感谢大家的意见和建议.我在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;
}
