TableCellRenderer использует данные из другой ячейки
-
21-12-2019 - |
Вопрос
У меня есть jTable1
с 2 колоннами.Я хочу контролировать внешний вид столбца 1, поэтому я использую следующий код, чтобы установить шрифт текста в ячейках полужирным или нет в зависимости от того, является ли строка ячеек четной или нечетной.
import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class CustomTableCellRenderer extends DefaultTableCellRenderer{
@Override
public Component getTableCellRendererComponent (JTable table, Object obj,
boolean isSelected, boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(
table, obj, isSelected, hasFocus, row, column );
if (row % 2 == 0){
cell.setFont(getFont().deriveFont(Font.BOLD));
}
return cell;
}
}
Я называю это, используя:
jTable1.getColumnModel().getColumn(1).setCellRenderer(new
CustomTableCellRenderer());
Я хочу изменить это TableCellRenderer
так что фон ячеек будет окрашен на основе значения другого столбца (столбца 0) в той же строке.Например, если значение в столбце 0, строка 5 — «книга», то столбец 1, ячейка строки 5 будет красным, а если значение столбца 0 — «газета», то цвет столбца 1 — зеленый.Моя проблема в том, что я не знаю, как передать значение столбца0 в средство визуализации столбца1, поэтому оно будет использоваться для изменения цветов.
Решение 3
Я нашел, как получить доступ к данным другого столбца:
import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class CustomTableCellRenderer extends DefaultTableCellRenderer{
@Override
public Component getTableCellRendererComponent (JTable table, Object obj,
boolean isSelected, boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(
table, obj, isSelected, hasFocus, row, column );
//I USE THIS TO ACCESS THE DATA FROM ANOTHER CELL!!!
TableModel model = table.getModel();
String media= (String) model.getValueAt(row, 0)
if (row % 2 == 0){
cell.setFont(getFont().deriveFont(Font.BOLD));
}
//SO I GET THE RESULT I WANT
if ("book".equals(media)){
cell.setBackground(Color.red)
}
else{
cell.setBackground(Color.green)
}
return cell;
}
}
Другие советы
Проверьте подпись .getTableCellRendererComponent(...)
метод:вы получаете ссылку на JTable (из которой вы можете получить TableModel) и индекс текущей строки и столбца.
Используя их, вы можете найти любое относительное значение, которое захотите.
Как показано здесь, вы можете переопределить prepareRenderer()
чтобы повлиять на целые строки.