javaswingjtablecellrenderer

Custom TableCellRenderer not working (table row rendering)


I'm trying to render an specific row of my jtable (it should have a different background color and it should have bold characters).

I found several questions regarding how to implement a custom TableCellRenderer (here and here) and the tutorial How to Use Tables and this one (Table Row Rendering).

I'm using a JInternalFrame to display the JTable. I tried to implement both solutions but neither getCellRenderer nor prepareRenderer are being called. When debugging, I can see my new jtable being created, but, my breakpoint inside the methods aren't called.

My code looks like:

this.add(createData(model));

private JComponent createData(ProfitLossTableModel model) {
    JTable table = new JTable(model) {

        public TableCellRenderer getCellRenderer(int row, int column) {
            if ((row == 0) && (column == 0)) {
                DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
                renderer.setHorizontalAlignment(JLabel.RIGHT);
                renderer.setBackground(Color.red);
                return renderer;
            } else {
                return super.getCellRenderer(row, column);
            }
        }
    };

    table.setPreferredScrollableViewportSize(table.getPreferredSize());
    table.changeSelection(0, 0, false, false);
    table.setAutoCreateRowSorter(true);
    return new JScrollPane(table);
}

As you can see, model is my implementation of a AbstractTableModel.

Of course that I'm missing something. I tried to call repaint() to see if something happened, but nothing occurred.

I also tried to put a JPane inside my JInternalFrame and them add the JScrollPane into it, but nothing occurred also.

Any help?

TIA,

Bob


Solution

  • As discussed in Concepts: Editors and Renderers, "the table invokes the table model's getColumnClass method, which gets the data type of the column's cells." You should verify that your implementation of AbstractTableModel returns a suitable value, as suggested in this example.

    Addendum:

    I'm trying to render a row, not a column.

    Rob Camick's Table Row Rendering approach that overrides prepareRenderer() seems apropos.

    tabbedPane.addTab("FirstRow", createFirstRow(model));
    ...
    private JComponent createFirstRow(DefaultTableModel model) {
    
        final Font font = new Font("Serif", Font.BOLD, 14);
    
        JTable table = new JTable(model) {
    
            public Component prepareRenderer(
                    TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if (!isRowSelected(row)) {
                    c.setBackground(row == 0 ? Color.yellow: getBackground());
                    c.setFont(row == 0 ? font : getFont());
                }
                return c;
            }
        };
    
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        table.changeSelection(1, 1, false, false);
        return new JScrollPane(table);
    }