Sascha's Wiki

Zelle einer Tabelle Highlighten

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.

Einfache Zelle Highlighten

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;
    }
}

Zelle mit einer JCheckbox Highlighten

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;
    }
}

Anwendung des CellRenderers

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.

Mögliche Probleme

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();
    }
}  

java/allgemein/cellrendererhighlight.txt · Zuletzt geändert: 2016/04/21 09:15 (Externe Bearbeitung)