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

Posted

技术标签:

【中文标题】自定义 TableCellRenderer/TreeTableCellRenderer 不呈现表格单元格【英文标题】:Custom TableCellRenderer/TreeTableCellRenderer doesn't render Table cells 【发布时间】:2013-08-17 17:06:41 【问题描述】:

我制作了这个 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;
    

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

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

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

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

【问题讨论】:

禁止怀孕 我也不明白;为什么Object.class什么不会变成蓝色?请编辑您的问题,在sscce 中包含您描述的问题。 【参考方案1】:

感谢大家的 cmets 和建议。我在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;

【讨论】:

啊,DefaultTableCellRenderer 默认是不透明的;可以在这种情况下使用吗?

以上是关于自定义 TableCellRenderer/TreeTableCellRenderer 不呈现表格单元格的主要内容,如果未能解决你的问题,请参考以下文章

自定义UI 自定义布局

自定义UI 自定义布局

自定义UI 自定义布局

自定义 view - 自定义属性

Springboot+自定义注解+自定义AOP前置增强+自定义异常+自定义异常捕获

Android 自定义View