自定义 TableCellRenderer/TreeTableCellRenderer 不呈现表格单元格
Posted
技术标签:
【中文标题】自定义 TableCellRenderer/TreeTableCellRenderer 不呈现表格单元格【英文标题】:Custom TableCellRenderer/TreeTableCellRenderer doesn't render Table cells 【发布时间】:2013-08-17 17:06:41 【问题描述】:我制作了这个 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());
我期待背景和前景分别在选择行时变为蓝色和白色。然而,它只发生在树表单元格(第一列),而在同一选定行的其他单元格中,只有前景发生变化,背景仍然是白色:
谁能告诉我为什么细胞(不是树细胞)不改变它们的背景颜色?
【问题讨论】:
禁止怀孕 我也不明白;为什么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 不呈现表格单元格的主要内容,如果未能解决你的问题,请参考以下文章