Изменить цвет определенных строк в моем JTable

Я ищу, как изменить цвет некоторых строк в моем JTable, которые имеют индекс в целочисленном векторе с именем Notfoundrow, но проблема в том, что у меня есть проблема, в результате которой все строки в таблице меняют цвет на красный!

Вот мой код:

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

И затем я вызываю этот класс:

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

tableM - это таблица, в которой я хочу изменить цвет строк.

Спасибо за любую помощь.


person IMIDEV    schedule 27.05.2013    source источник
comment
Первоначальные мысли, первые два оператора if — это одно и то же. Как только вы измените цвет ячейки, вам действительно нужно продолжать проверять ArrayList после того, как вы получите положительное совпадение?   -  person MadProgrammer    schedule 27.05.2013
comment
Этот ответ также поможет вам.   -  person Amarnath    schedule 27.05.2013


Ответы (1)


Вы могли бы значительно упростить свою логику...

Вместо цикла while воспользуйтесь доступной функциональностью API...

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

введите здесь описание изображения

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. Вы также можете прочитать условия кода для языка программирования Java.

person MadProgrammer    schedule 27.05.2013
comment
спасибо, MadProgrammer, все работает Мне нравятся эти комментарии. Вроде бы дали полностью исполняемый код, который не работает. +1! :-) - person Guillaume Polet; 28.05.2013