Возникли проблемы с 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++){
используя количество столбцов, но это не решило причину вашего сообщения.