Я следил за учебными пособиями, изучая все это о JTable Renderers/Editors, но я застрял, пытаясь создать условный рендерер, предназначенный для отображения ячеек разными цветами в соответствии с набором условий.
Вот SSCCE, который я собрал:
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumnModel;
public class Demo2 extends javax.swing.JFrame {
public Demo2() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300, 300);
this.getContentPane().setLayout(new java.awt.GridLayout(1, 1));
Object[] colunas = {"Col 0"};
Object[][] dados = {{"A"},{"B"},{"C"},{"D"}};
JTable tbl = new JTable(dados,colunas);
TableColumnModel tcm = tbl.getColumnModel();
tcm.getColumn(0).setCellRenderer(new CustomCellRenderer());
JScrollPane sp = new JScrollPane(tbl);
this.add(sp);
}
class CustomCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.getTableCellRendererComponent(jtable, value, isSelected, hasFocus, row, column);
if (value.toString().equals("B")) {
c.setForeground(Color.GREEN);
c.setFont(c.getFont().deriveFont(Font.BOLD));
} else if (value.toString().equals("D")) {
c.setForeground(Color.BLUE);
c.setFont(c.getFont().deriveFont(Font.BOLD));
}
return this;
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Demo2().setVisible(true);
}
});
}
}
Как я и ожидал, вторая ячейка имеет зеленый передний план и выделена жирным шрифтом, а четвертая — также синяя и жирная. Тем не менее, другие ячейки, по-видимому, также были затронуты изменением цвета переднего плана.
При отладке с точками останова я вижу, что он выполняет setForeground только в правильных строках, хотя он выполняет оба дважды, что было неожиданно.
Кроме того, если я изменю последнюю ячейку с «D» на «DD», то передний план каждой ячейки станет зеленым.
Я думаю, что мне не хватает чего-то фундаментального в рендерерах.