Java 使用cutsom TableCellRenderer更改单元格的背景

Java 使用cutsom TableCellRenderer更改单元格的背景,java,swing,jtable,Java,Swing,Jtable,我有一个有三列字符串的表。我希望最后一列有绿色背景和粗体字体。所以我想我需要一个定制的TableCellRenderer。但是,当我调用table.setDefaultRenderer时,它会查找类columnClass以及自定义渲染器的实例。所以我给它赋值String.class。但它不用于渲染,我在它的getTableCellRenderComponent方法中设置了一个断点,它没有被命中 下面是我设置自定义渲染器的代码- public class TableTest extends JPa

我有一个有三列字符串的表。我希望最后一列有绿色背景和粗体字体。所以我想我需要一个定制的TableCellRenderer。但是,当我调用
table.setDefaultRenderer
时,它会查找
类columnClass
以及自定义渲染器的实例。所以我给它赋值
String.class
。但它不用于渲染,我在它的getTableCellRenderComponent方法中设置了一个断点,它没有被命中

下面是我设置自定义渲染器的代码-

public class TableTest extends JPanel implements ActionListener {

    MyTableCellRenderer renderer = new MyTableCellRenderer();
    MyTableModel model = new MyTableModel();
    JTable table = new JTable();


    public TableTest() {
        super(new GridLayout(1,0));

        this.setPreferredSize(new Dimension(800, 800));

        model.addRow(Arrays.asList("Testing", "Hello world", "Goodbye"));
        model.addRow(Arrays.asList("Testing", "Hello world", "Goodbye"));
        table = new JTable(model);
        table.setDefaultRenderer(String.class, new MyTableCellRenderer());
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);

        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);

        //Add the scroll pane to this panel.
        add(scrollPane);
    }
}



public class MyTableCellRenderer extends JLabel implements TableCellRenderer {

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

        this.setText(value.toString());
        setBackground(Color.GREEN);
        setText("Test");
        return this;
}   

public class MyTableModel extends AbstractTableModel {

    private List<String> columnNames = new ArrayList<String>();

    private List<List> data = new ArrayList();

    {
        columnNames.add("Test");
        columnNames.add("Test");
        columnNames.add("Test");
    }

    public void addRow(List<String> rowData) {
        data.add(rowData);
        fireTableRowsInserted(data.size() - 1, data.size() - 1);
    }

    public int getRowCount() {
        return data.size();
    }

    public int getColumnCount() {
        return columnNames.size();
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        return data.get(rowIndex).get(columnIndex);
    }

}
公共类TableTest扩展JPanel实现ActionListener{
MyTableCellRenderer=新建MyTableCellRenderer();
MyTableModel模型=新的MyTableModel();
JTable table=新的JTable();
公共表格测试(){
超级(新网格布局(1,0));
此.setPreferredSize(新尺寸(800800));
addRow(Arrays.asList(“Testing”、“helloworld”、“再见”);
addRow(Arrays.asList(“Testing”、“helloworld”、“再见”);
表=新JTable(型号);
setDefaultRenderer(String.class,新的MyTableCellRenderer());
表.setPreferredScrollableViewportSize(新维度(500,70));
表.setFillsViewPerthweight(真);
//创建滚动窗格并将表添加到其中。
JScrollPane scrollPane=新的JScrollPane(表);
//将滚动窗格添加到此面板。
添加(滚动窗格);
}
}
公共类MyTableCellRenderer扩展了JLabel,实现了TableCellRenderer{
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
this.setText(value.toString());
挫折背景(颜色:绿色);
setText(“测试”);
归还这个;
}   
公共类MyTableModel扩展了AbstractTableModel{
private List columnNames=new ArrayList();
私有列表数据=新的ArrayList();
{
列名称。添加(“测试”);
列名称。添加(“测试”);
列名称。添加(“测试”);
}
public void addRow(列出行数据){
data.add(rowData);
fireTableRowsInserted(data.size()-1,data.size()-1);
}
public int getRowCount(){
返回data.size();
}
public int getColumnCount(){
返回columnNames.size();
}
公共对象getValueAt(int行索引、int列索引){
返回data.get(rowIndex).get(columnIndex);
}
}
我做错了什么,为什么不使用单元格渲染器


注意:我编辑了这篇文章以包含其他类。

检查您的
TableModel.getColumnClass(int-col)
,可能它返回
Object.class
。然后您需要使用
Object.class
而不是
String.class
,即:

table.setDefaultRenderer(Object.class, new MyTableCellRenderer());

也许你可以在那里找到如何使用的例子 ,或

我希望最后一列有绿色背景和粗体字体

如果您只想在最后一列上进行自定义呈现,而不是调用
table.setDefaultRenderer()
,则可以使用此选项(假设表中有固定数量的列):


我看到您有自己的
MyTableModel
。您是否重载了
getColumnClass()
在您的模型中?然后您可以指定第一列包含字符串,然后表格应该使用您为字符串设置的渲染器。

请确定渲染器的代码在哪里。我认为将MyTableCellRenderer的代码也包括在内会很方便。MyTableModel是否实现了
getColumnClass
?如果是,请将其调试为discover它返回的是什么类。为了更快地获得更好的帮助,请发布一条消息。嗨,伙计们,我现在已经包括了其他类。(和@Max)column类通常是罪魁祸首,但在OPs要求中不是问题:-)逻辑步骤是调整表模型以返回getColumnClass方法的String.class,而不是注册Object.class的呈现器
table.getColumnModel().getColumn(table.getColumnCount()-1).setCellRenderer(new MyTableCellRenderer());