Wenn man eine bestimmte Zelle Highlighten möchte, muss man einen CellRenderer implementieren. Weiter unten werde ich noch auf das Highlighten einer JCheckBox in einer Tabelle sowie dem Aufruf eingehen.
import java.awt.Color; import java.awt.Component; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; /** * * @author Changer */ public class HighlightCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); //Hier wird von einer Tabelle ausgegangen in der eine Zelle hervorgerufen wird, //wenn der Wert der ersten Spalte true ist. Boolean enabled = (Boolean) table.getValueAt(row, 0); //Hier wird das eigentliche Highlighting übernommen if (enabled) { setForeground(Color.BLACK); setBackground(new Color(106, 252, 77, 150)); } else { setForeground(Color.BLACK); setBackground(Color.WHITE); } return this; } }
import java.awt.Color; import java.awt.Component; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; /** * * @author Changer */ public class HighlightCheckboxCellRenderer extends JCheckBox implements TableCellRenderer { public HighlightCheckboxCellRenderer() { //notwendig um die Checkbox mittig darzustellen setHorizontalAlignment(JLabel.CENTER); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { //Hier wird von einer Tabelle ausgegangen in der eine Zelle hervorgerufen wird, //wenn der Wert der ersten Spalte true ist. Boolean enabled = (Boolean) table.getValueAt(row, 0); //Hier wird das eigentliche Highlighting übernommen if (enabled) { setForeground(Color.BLACK); setBackground(new Color(106, 252, 77, 150)); } else { setForeground(Color.BLACK); setBackground(Color.WHITE); } //Nun muss noch der Wert der Checkbox entsprechend gesetzt werden setSelected((value != null && ((Boolean) value).booleanValue())); return this; } }
Nachfolgender Code muss in in der Klasse angewendet werden, in der die Tabelle initialisiert wird.
//Renderer für die JCheckbox in Spalte 1 setzen this.jTable1.getColumnModel().getColumn(0).setCellRenderer(new HighlightCheckboxCellRenderer()); //Renderer für normale Zellen in Spalte 2 setzen this.jTable1.getColumnModel().getColumn(1).setCellRenderer(new HighlightCellRenderer());
Die anschließende Tabelle sollte bei aktivierter JCheckbox leicht grünes Highlighting besitzen.
Es kann sein dass in dem oben beschriebenen Fall die zweite Spalte erst aktualisiert wird wenn die Tabelle neu gezeichnet wird. Um diesem Problem aus dem Weg zu gehen, muss man nur einen PropertyChangeListener für die Tabelle erzeugen und nachfolgenden Code verwenden.
private void jTable1PropertyChange(java.beans.PropertyChangeEvent evt) { //Wichtig hierbei ist, dass die Tabelle nur dann durch repaint() neu //gezeichnet wird, wenn der betroffene Wert (hier in Spalte 1) modifiziert wird. if (jTable1.getSelectedColumn() == 0){ this.jTable1.repaint(); } }