max58
max58

Reputation: 11

JTable renderer does not colour the cell

screenshot

I have written a renderer and my program does not color the cell and I don't know why. When I try to color the whole row it also colors only 3 of the 7 rows. Can someone please help me?

public void isLow(JTable jTableBestandstabelle) {
    jTableBestandstabelle.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
        @Override
        public Component getTableCellRendererComponent(
                JTable aTable, Object aNumberValue, boolean aIsSelected,
                boolean aHasFocus, int aRow, int aColumn
        ) {

            if (aNumberValue == null) {
                return this;
            }
            Component renderer = super.getTableCellRendererComponent(
                    aTable, aNumberValue, aIsSelected, aHasFocus, aRow, aColumn
            );
            int m = (int) jTableBestandstabelle.getValueAt(aRow, 4);
            int a = (int) jTableBestandstabelle.getValueAt(aRow, 5);
            if (a < m && column == 5) {
                renderer.setForeground(Color.black);
                renderer.setBackground(Color.red);
            } else {
                renderer.setForeground(Color.black);
            }
            return this;
        }


    }); 
}

public void isLow(JTable jTableBestandstabelle) {
    jTableBestandstabelle.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
        @Override
        public Component getTableCellRendererComponent(
                JTable aTable, Object aNumberValue, boolean aIsSelected,
                boolean aHasFocus, int aRow, int aColumn
        ) {

            if (aNumberValue == null) {
                return this;
            }
            Component renderer = super.getTableCellRendererComponent(
                    aTable, aNumberValue, aIsSelected, aHasFocus, aRow, aColumn
            );
            int m = (int) jTableBestandstabelle.getValueAt(aRow, 4);
            int a = (int) jTableBestandstabelle.getValueAt(aRow, 5);
            if (a < m) {
                renderer.setForeground(Color.black);
                renderer.setBackground(Color.red);
            } else {
                renderer.setForeground(Color.black);
            }
            return this;
        }


    }); 
}

Upvotes: 0

Views: 47

Answers (1)

Sergiy Medvynskyy
Sergiy Medvynskyy

Reputation: 11327

You have two problem in your code:

  1. You use a boolean columns in your table (last column). So if you want to present a checkbox in the column you cannot use a DefaultTableCellRenderer

  2. When you use table.setDefaultRenderer(Object.class, renderer) this will not work for some primitive tapes like Boolean.class or Integer.class (don't know why). So you need to set the renderer for these classes too (table.setDefaultRenderer(Integer.class, renderer) and table.setDefaultRenderer(Boolean.class, renderer)). But due to the point 1 its not a good idea.

Here is mine solution:

import java.awt.Color;
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

/**
 * <code>TestTable</code>.
 */
public class TestTable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new TestTable()::startUp);
    }

    private void startUp() {
        DefaultTableModel model = new DefaultTableModel(0, 7) {
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                if (columnIndex == 6) {
                    return Boolean.class; // last column is boolean
                } else if (columnIndex == 0 && columnIndex > 3) {
                    return Integer.class; // 1, 4, 5 are integers
                }
                return super.getColumnClass(columnIndex);
            }
        };
        model.addRow(new Object[] {1, "Test1", "Test2", "Test3", 6, 5, false});
        model.addRow(new Object[] {1, "Test11", "Test22", "Test33", 4, 5, true});
        JTable table = new JTable(model);
        for (int i = 0; i < table.getColumnCount(); i++) {
            TableColumn col = table.getColumnModel().getColumn(i);
            int modelCol = table.convertColumnIndexToModel(i);
            col.setCellRenderer(new MyCellRenderer(table.getDefaultRenderer(model.getColumnClass(modelCol))));
        }
        JFrame frm = new JFrame("Table test");
        frm.add(new JScrollPane(table));
        frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frm.pack();
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    private static class MyCellRenderer implements TableCellRenderer {
        private final TableCellRenderer origin;

        public MyCellRenderer(TableCellRenderer origin) {
            this.origin = origin;
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            Component c = origin.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            int m = (int) table.getValueAt(row, 4);
            int a = (int) table.getValueAt(row, 5);
            if (a < m) {
                c.setForeground(Color.black);
                c.setBackground(Color.red);
            } else {
                c.setForeground(Color.black);
                c.setBackground(Color.white);
            }
            return c;
        }
    }
}

Upvotes: 1

Related Questions