2

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

Community
  • 1
  • 1
Bob Rivers
  • 5,261
  • 6
  • 47
  • 59
  • The code you posted looks fine. However, we don't know the context of how you are actually using this code. So you first job is to create a SSCCE (http://sscce.org) using the DefaultTableModel and see if you can get the code working. If not you post the entire 15 line SSCCE program so we can see exactly what you are doing. Once that works you try using your custom TableModel. – camickr Oct 10 '10 at 15:55

1 Answers1

2

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);
}
trashgod
  • 203,806
  • 29
  • 246
  • 1,045