5

因为我的项目中有很多对象,所以我制作了这个CustomCellRenderer类以用于对象JXTreeTable和对象。JXTable所以这个类实现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;
    }
}

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

jXTreeTableConsumos.setDefaultRenderer(Object.class, new CustomCellRenderer());
jXTreeTableConsumos.setTreeCellRenderer(new CustomCellRenderer());

I'm expecting background and foreground become blue and white respectively when a row is selected. 然而,它只发生在树表单元格(第一列),而在同一选定行的其他单元格中,只有前景发生变化,背景仍然是白色:

在此处输入图像描述

谁能告诉我为什么细胞(不是树细胞)不会改变它们的背景颜色?

4

1 回答 1

7

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

设置此组件的背景颜色。仅当组件为 opaque 时才使用背景色,并且仅由 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;
}

在此处输入图像描述

于 2013-08-15T14:25:59.290 回答