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

时间:2012-03-19 18:24:09

标签: 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);
    }

}

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

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

也许在那里你可以找到如何使用Renderer JTable作为示例 here,或herehere

答案 2 :(得分:2)

  

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

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

table.getColumnModel().getColumn(table.getColumnCount()-1).setCellRenderer(new MyTableCellRenderer());

答案 3 :(得分:1)

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