DefaultTableCellRenderer 不工作

Posted

技术标签:

【中文标题】DefaultTableCellRenderer 不工作【英文标题】:DefaultTableCellRenderer not working 【发布时间】:2017-07-17 04:53:52 【问题描述】:

如果我的 JTable 的第三行的单元格有值,我正在尝试更改它们的颜色。我读到这样做的一个好方法是使用表格单元格渲染器。但是,它似乎什么也没做!这是我的 RENDERER 代码:

public class RenderTablaPrestamos extends DefaultTableCellRenderer

   @Override
   public Component getTableCellRendererComponent (JTable tabla, Object valor,
                                                boolean isSelected, boolean hasFocus,
                                                int row, int col)
    JLabel celda = (JLabel) super.getTableCellRendererComponent(tabla, valor, isSelected, hasFocus, row, col);

        if(valor instanceof Integer)
            Integer v=(Integer)valor;
            if(col==3)
                if(valor!=null)
                     celda.setBackground(Color.red);
                
                else
                    celda.setBackground(Color.WHITE);
                
            
            else
                celda.setBackground(Color.WHITE);
            
        
    return celda;
    

这里是我如何使用我的渲染器:

tablaUsuariosPrestamos.setDefaultRenderer(Object.class,new RenderTablaPrestamos());

这是我的 JTable 的图片(我不认为模型代码有什么用,因为它有点长):

我认为它与 if 子句 没有任何关系,因为我评论过它们,它也不起作用。

我哪里错了?

【问题讨论】:

您正在为 Object 类设置渲染器。您的模型似乎表明第三个 olumn 的类是 Integer (因为它们已经以特定方式呈现)。提出一个完整的最小程序重现问题。无需发布您的真实模型。此外,您至少可以通过使用调试器并设置断点来简单地检查您的渲染器是否被调用。你为什么不这样做? 如需尽快获得更好的帮助,请发帖 minimal reproducible example 或 Short, Self Contained, Correct Example。顺便说一句 - 标签需要不透明才能显示 BG 颜色。 【参考方案1】:

使用

for (int i = 0; i < tabla.getColumnCount(); i++) 
    tabla.getColumnModel().getColumn(i).setCellRenderer(new RenderTablaPrestamos());

而不是

tablaUsuariosPrestamos.setDefaultRenderer(Object.class,new RenderTablaPrestamos());

【讨论】:

【参考方案2】:

setDefaultRenderer 中的代码按预期运行:

final YourCellRenderer cellRenderer = new YourCellRenderer();
YourTableModel stModel = new YourTableModel();
table = new JTable(stModel);

table.setDefaultRenderer(YourComponent.class, cellRenderer);

它似乎没有渲染的原因是,当您将YourComponent.class 映射到渲染器时,它没有触发,因为YourTableModel 认为该类是Object

要纠正这个问题,您需要覆盖 YourTableModel 类中的 getColumnClass 方法:

public class YourTableModel extends AbstractTableModel 

    ...

    @Override
    public Class<?> getColumnClass(int columnIndex) 
        return YourComponent.class;
    
    ...

【讨论】:

以上是关于DefaultTableCellRenderer 不工作的主要内容,如果未能解决你的问题,请参考以下文章

为 jTable 行着色

JTable设置表格背景颜色——隔行不同

如何在摇摆中的假if语句后连续闪烁表格单元格