0

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


    }); 
}
khelwood
  • 55,782
  • 14
  • 81
  • 108
max58
  • 11
  • 3
  • 1
    Maybe it should be `return renderer;` ? – Arnaud Oct 22 '19 at 12:50
  • no i also tried this :( – max58 Oct 22 '19 at 12:54
  • i also tried System.out.println(renderer); and as a result came 1 2 3 i think the problem is that the reenderer only get 3 rows but i dont know why – max58 Oct 22 '19 at 12:57
  • 1
    *When I try to color the whole row it also colors only 3 of the 7 rows* - probably because your columns contain different types of date (ie, not all String), so those columns will use a different renderer. To highlight an entire row based on data in the row check out: https://stackoverflow.com/questions/8137766/jtable-row-color-depending-on-value-in-model/8139123#8139123 – camickr Oct 22 '19 at 14:39
  • For better help sooner, [edit] to add a [MCVE] or [Short, Self Contained, Correct Example](http://www.sscce.org/). – Andrew Thompson Oct 22 '19 at 15:48

1 Answers1

1

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;
        }
    }
}
Sergiy Medvynskyy
  • 11,160
  • 1
  • 32
  • 48
  • 1
    *don't know why* - because Swing provides default renderers for those data types. The `Object` renderer is only used if a data type does not have a default renderer. – camickr Oct 22 '19 at 15:19
  • Note the `&&` should be `||` in the `getColumnClass(...)` method. Also, the renderer doesn't work if the columns are reordered. The logic in the renderer needs to use the `convertColumnIndexToModel(...)` method. – camickr Oct 22 '19 at 15:29
  • Thank you very much now i understand it – max58 Oct 22 '19 at 15:30