java - 使用自定义 TableCellRenderer 更改单元格的背景

标签 java swing jtable

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

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

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);
    }

}

我做错了什么,为什么单元格渲染器没有被使用?

注意:我已编辑该帖子以包含其他类(class)。

最佳答案

检查您的TableModel.getColumnClass(int col),也许它返回Object.class。那么你需要用Object.class而不是String.class来注册渲染器,即:

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

关于java - 使用自定义 TableCellRenderer 更改单元格的背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9775711/

相关文章:

java - 当变量值改变时如何更新JTable和JTree?

java - 如何将一定数量的字节读入缓冲区?

java - 以多对一关系归档的版本导致对象引用未保存的 transient 实例

java - 如何将数据从服务/线程类传递到主 Activity ?

java - 如何在Mule 4中将hashmap转换为正确的json格式?

java - 自动/最适合 JTable 列,但拉伸(stretch)最后一列

java - 计算按钮不起作用

java - 防止 Swing GUI 在后台任务期间锁定

java - 我正在尝试创建一个 JTable,其中填充了对象 LinkedList 中保存的数据

java - 需要有关 JTable 的帮助吗?