Возникли проблемы с preperedRenderer JTable

Я знаю, что есть много вопросов на эту тему, но по какой-то причине просто не могу найти способ обойти это дело.

Мне нужно изменить цвет строки, если два столбца не имеют одинаковые значения.

видел эту ссылку: http://tips4java.wordpress.com/2010/01/24/table-row-rendering/

но не могу заставить его работать....

попробовал это также:

public void colorRow(JTable table){
        for(int column=0;column<table.getRowCount();column++){
        for(int row=0;row<table.getRowCount();row++){
            TableCellRenderer renderer = table.getCellRenderer(row, column);
            Component comp = table.prepareRenderer(renderer, row, column);
            Float sinh = (Float)table.getModel().getValueAt(row,6);
            Float kol = (Float)table.getModel().getValueAt(row, 5);
            if(!kol.equals(sinh)){
                comp.setBackground(Color.YELLOW);
            }
        }
        }
    }

но он рисует все строки в таблице, если есть строка, в которой столбцы 5 и 6 не имеют одинакового значения.

был бы признателен за любую помощь

Обновление (SSCCE):

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JScrollPane;
import javax.swing.JTable;

public class table extends JFrame {

    private JPanel contentPane;
    private JTable table;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    table frame = new table();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    public table() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 495, 317);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new GridLayout(1, 0, 0, 0));

        DefaultTableModel model = new DefaultTableModel();

        model.addColumn("ID");
        model.addColumn("Value 1");
        model.addColumn("Value 2");

        int id1=1;
        int id2=2;
        int id3=3;
        Float one1=3.0f;
        Float two1=4.0f;
        Float one2=2.0f;
        Float two2=2.0f;
        Float one3=1.0f;
        Float two3=2.0f;

        model.insertRow(0, new Object [] {id1, one1,two1});
        model.insertRow(0, new Object [] {id2, one2,two2});
        model.insertRow(0, new Object [] {id3, one3,two3});

        JScrollPane scrollPane = new JScrollPane();
        contentPane.add(scrollPane);

        table = new JTable(model);
        scrollPane.setViewportView(table);
        colorRow(table);

    }
    public void colorRow(JTable table){
        for(int column=0;column<table.getColumnCount();column++){
        for(int row=0;row<table.getRowCount();row++){
            TableCellRenderer renderer = table.getCellRenderer(row, column);
            Component comp = table.prepareRenderer(renderer, row, column);
            comp.setBackground(getBackground());
            Float sinh = (Float)table.getModel().getValueAt(row,2);
            Float kol = (Float)table.getModel().getValueAt(row, 1);
            if(!kol.equals(sinh)){
                comp.setBackground(Color.YELLOW);
            }
        }
        }
    }

}

1 ответ

Решение

Я только что попробовал решение из этого поста с вашим SSCCE, и оно работает. Так что удалите colorRow() метод, то в вашем конструкторе замените таблицу инициализации table = new JTable(model); с этим:

    table = new JTable(model) {
        @Override
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component comp = super.prepareRenderer(renderer, row, column);
            int modelRow = convertRowIndexToModel(row);
            Float sinh = (Float) getModel().getValueAt(modelRow, 2);
            Float kol = (Float) getModel().getValueAt(modelRow, 1);
            comp.setBackground(kol.equals(sinh) ? getBackground() : Color.YELLOW);
            return comp;
        }
    };

Вы устранили проблему, на которую я указал в исходном примере кода: for(int column=0; column < table.getRowCount(); column++){ используя количество столбцов, но это не решило причину вашего сообщения.

Другие вопросы по тегам