import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
public class ColoredGroupTableDemo extends JFrame {
private JTable table;
public ColoredGroupTableDemo() {
DefaultTableModel model = new DefaultTableModel(new Object[][] {
{"Gruppe1", "A"},
{"Gruppe1", "B"},
{"Gruppe1", "C"},
{"Gruppe2", "D"},
{"Gruppe2", "E"},
{"Gruppe3", "F"},
{"Gruppe4", "G"},
{"Gruppe4", "H"},
{"Gruppe5", "I"},
{"Gruppe5", "J"}},
new String[] {"Gruppe", "Wert"}
);
table = new GroupingTable(model, 0);
this.getContentPane().add(new JScrollPane(table));
}
class GroupingTable extends JTable {
private int keyColumn; //für die Farbgebung relevante Spalte
private Color[] color = new Color[] {Color.GRAY, Color.CYAN};
private int[] colorIndex; //"Model" zur Speichern der Zeilenfarbe
public GroupingTable(TableModel model, int column) {
super(model);
this.keyColumn = column;
determineColor();
}
//tableChanged überschrieben, damit das "Farbenmodel" aktualisiert wird
public void tableChanged(TableModelEvent evt) {
if (evt.getColumn()==keyColumn)
determineColor();
super.tableChanged(evt);
}
//Methode zum Ermitteln der Zeilenfarbe
private void determineColor() {
colorIndex = new int[this.getRowCount()];
if (colorIndex.length<=0)
return;
int colorCount=0;
colorIndex[0] = colorCount;
for (int row=1; row<this.getRowCount(); row++) {
if(this.getValueAt(row, this.convertColumnIndexToView(keyColumn))
.equals(this.getValueAt(row-1, this.convertColumnIndexToView(keyColumn))))
colorIndex[row] = colorCount & 1;
else
colorIndex[row] = ++colorCount & 1;
}
repaint();
}
//überschrieben, um die Zeilenfarbe zu setzen.
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = (Component) super.prepareRenderer(renderer, row, column);
if (this.getSelectedRow()==row)
return c;
c.setBackground(color[colorIndex[row]]);
return c;
}
}
public static void main(String[] args) {
JFrame frame = new ColoredGroupTableDemo();
frame.setBounds(0, 0, 500, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}