更改JTable单元格颜色

Jos*_*zel 7 java formatting swing rendering jtable

这让我非常疯狂.

我知道,要使用JTable更改表格单元格的格式,我必须使用自己的渲染器.但我似乎无法正确实现这一点.

这是我目前的设置:

public class MyClass
{
    public static void main(String args[])
    {
        JTable myTable = new JTable(10, 10);
        myTable.setDefaultRenderer ([I dont know what to put here], new CustomRenderer());
    }
}

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Formatting
        return c;
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要为第一个参数使用setDefaultRenderer什么?API只是说'class'.我不知道该放什么.

有人可以用最简单的术语解释我是如何实现这个的吗?请提供一个示例,说明如何从main()方法中更改格式.

Cam*_*pka 13

在第一个参数for中setDefaultRenderer,为要覆盖渲染的Class 放置类文字.即,如果您的数据包含所有字符串,您可以放置

myTable.setDefaultRenderer(String.class, new CustomRenderer());
Run Code Online (Sandbox Code Playgroud)

如果您的数据也包含带有BigDecimalInteger作为类的值,则必须为每个类类型(BigDecimal.classInteger.class在每种情况下)多次调用该方法.

最后,要更改背景颜色,请在渲染器中执行此操作:

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(new java.awt.Color(255, 72, 72));
        return c;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果编写一个适用于所有接口类的渲染器,则还需要修改表模型getColumnClass功能,并让它返回实现此接口的所有对象的接口类:

public Class<? extends Object> getColumnClass(int c) {
    Object object = getValueAt(0, c);
    if(object == null) {
        return Object.class;
    if(getValueAt(0, c) instanceof IColorable) {
        return ICarPart.class;
    } else {
        return getValueAt(0, c).getClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,可以为IColorable.class注册一个渲染器,并且不需要为每个实现注册一个单独的渲染器.

  • 您需要使用Object.class,因为您创建了一个没有传递TableModel的JTable.创建的默认表模型为每个列类型返回Object.class.请参阅:TableModel :: getColumnClass(int col) (5认同)
  • 我通过使用Object.class而不是String.class来实现它.不知道为什么这是必要的,因为我的所有数据都是字符串.谢谢您的帮助! (2认同)