2

I am looking for how to change the color of some rows in my JTable which have index in an integer vector called Notfoundrow, but the problem that I have as result all the rows in the Table change color to Red !!

Here is my code :

package essai_trafficclass;
import java.awt.Color;
import java.awt.Component;
import java.util.ArrayList;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MonCellRenderer extends DefaultTableCellRenderer {

    public static ArrayList<Integer> Notfoundrow1 = OneWayRelation.Notfoundrow;

    public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
        Component cell = super.getTableCellRendererComponent(table, value,
                        isSelected, hasFocus, row, column);
        int L = 0;
        while (L < Notfoundrow1.size()) {
            System.out.println("la valeur du vecteur " + Notfoundrow1.get(L));
            if (row == Notfoundrow1.get(L) && column == 1) {
                cell.setBackground(Color.RED);
            } else if (row == Notfoundrow1.get(L) && column == 1) {
                cell.setBackground(Color.RED);
            } else {
                cell.setBackground(Color.WHITE);
            }
            L++;
        }
        return cell;
    }
}

And then I Call this class by :

tableM.setDefaultRenderer(Object.class, new MonCellRenderer());    

tableM is the table that i want change the color if its rows.

Thank you for any Help.

MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
IMIDEV
  • 111
  • 2
  • 4
  • 11
  • Initial thoughts, the first two `if` statements are the same thing. Once you change the cell color, do you really need to continue checking the `ArrayList` once you get a positive match? – MadProgrammer May 27 '13 at 11:34
  • This [answer](http://stackoverflow.com/questions/14563799/jtable-cellrenderer-changes-backgroundcolor-of-cells-while-running/14565614#14565614) also helps you. – Amarnath May 27 '13 at 12:27

1 Answers1

4

You could simplify your logic considerably...

Rather then your while loop, take advantage of the available functionality of the API...

if (column == 1 || Notfoundrow1.contains(row)) {
    setBackground(Color.RED);
} else {
    setBackground(Color.WHITE);
}

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TestCellRenderer02 {

    public static void main(String[] args) {
        new TestCellRenderer02();
    }
    private List<Integer> notFound = new ArrayList<>(25);

    public TestCellRenderer02() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                Random rand = new Random(System.currentTimeMillis());
                DefaultTableModel model = new DefaultTableModel(new Object[]{"A", "B"}, 0);
                for (int index = 0; index < 100; index++) {
                    model.addRow(new Object[]{index, index});
                    if (rand.nextBoolean()) {
                        notFound.add(index);
                        System.out.println("Not found @ " + index);
                    }
                }

                JTable table = new JTable(model);
                table.setDefaultRenderer(Object.class, new MonCellRenderer());

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MonCellRenderer extends DefaultTableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value,
                        boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, value,
                            isSelected, hasFocus, row, column);

            if (column == 1 || notFound.contains(row)) {
                setBackground(Color.RED);
            } else {
                setBackground(Color.WHITE);
            }
            return this;
        }
    }
}

ps- You might also like to take a read through Code Conventions for the Java Programming Language

MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
  • _thank you MadProgrammer it works_ I love those comments. "Like we would give a fully executable code that does not work". +1! :-) – Guillaume Polet May 27 '13 at 21:50