# JTable, DefaultTableCellRenderer & AbstractTableModel



## derToby (26. Apr 2007)

Hi zusammen,

ich habe ein kleines Problemchen. Also ich möchte eine Tabelle erstellen, in der manche Zellen farbig markiert werden. 
Dazu habe ich ein TableModel und einen TableCellRenderer programmiert. Die Tabelle wird korrekt erzeugt, mit Daten füllt, aber leider nicht farbig markiert.

Vielleicht fällt jemanden von euch auf, was ich verkehrt gemacht habe.

Hier der Code: 
in JFrame:

```
DefaultTableCellRenderer ren = new ColoredTableCellRenderer();
		JTable table = new JTable();
		table.setDefaultRenderer(ColoredTableCellRenderer.class, ren);

		TableModel model = new QuadratTableModelSimple();
		model.isCellEditable(0, 0);
		table.setModel(model);
		JScrollPane scrollpane = new JScrollPane(table);
		pan.add(scrollpane);
```

ColoredTableCellRenderer:

```
import java.awt.Color;

import javax.swing.table.DefaultTableCellRenderer;

class ColoredTableCellRenderer extends DefaultTableCellRenderer {
	ColoredTableCellRenderer() {
		super();
		System.out.println("konstruktor");
	}

	public void setValue(Object value) {
		System.out.println("method");
		setForeground(Color.red);
	}
}
```

Interessant ist, dass der Konstruktor vom Renderer aufgerufen wird (sehe ich an der Ausgabe), aber die setValue Methode nicht. Woran kann das liegen?

schönen Gruß

tobias


----------



## Wildcard (26. Apr 2007)

Diese Methode musst du überschreiben:
http://java.sun.com/javase/6/docs/a...java.lang.Object, boolean, boolean, int, int)


----------



## derToby (27. Apr 2007)

Hi,
vielen Dank für deine Antwort!
Ich glaube mir ist die Vorgehensweise noch nicht ganz klar. Gefüllt wird mir meine Tabelle vom AbstractTableModel. Nun soll beim Füllen, bzw. später auch bei Änderung vom User, kontrolliert werden, ob der Eintrag korrekt ist, und die Zelle entsprechend der Auswertung farbig markiert werden. 

AbstractTableModel - enthält die Daten
DefaultTableCellRenderer  - enthält die Methode zum Färben der Zelle

Mein JFrame - Klasse erzeugt die beiden Objekte. Nach meinem Verständnis müßte jetzt in der JFrame - Klasse auch die Methode DefaultTableCellRenderer.getTableCellRendererComponent(...) aufgerufen werden. Doch warum an der Stelle? Mein Model füllt doch die Tabelle...

Desweiteren verstehe ich die notwendigen Parameter nicht, warum sie so genau angegeben werden müssen.

Parameters:
1. table - the JTable
2. value - the value to assign to the cell at [row, column]
3. isSelected - true if cell is selected
4. hasFocus - true if cell has focus
5. row - the row of the cell to render
6. column - the column of the cell to render

Dachte nicht, dass es so kompliziert werden würde. ;-(

gruß

derToby


----------



## Wildcard (27. Apr 2007)

Am besten du schaust dir Beni's hervorragendes JTable Tutorial in der FAQ an.


----------



## André Uhres (27. Apr 2007)

Einfach nur die Methode "prepareRenderer" von JTable überschreiben
(siehe auch http://www.java-forum.org/de/viewtopic.php?t=7708 4. Darstellung auf Zeilen- oder Tabellen-Ebene ):

```
package table;
/*
 * TabelleFaerbenDemo.java
 */
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class TabelleFaerbenDemo extends JFrame {
    private JTable table;
    private Border selectionBorder = BorderFactory.createLineBorder(Color.BLUE);
    public TabelleFaerbenDemo() {
        super("Tabelle färben Demo");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        table = new JTable() {
            public Component prepareRenderer(
                    final TableCellRenderer renderer, final int row, final int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                boolean selected = isRowSelected(row) && isColumnSelected(column);
                if( selected ) ((JComponent)c).setBorder(selectionBorder);
                if(goodValue(row,column)) c.setBackground(Color.WHITE);
                else c.setBackground(Color.RED);
                return c;
            }
        };
        table.setModel(new DefaultTableModel(
                new Object [][] {
                    {"Aha", new Boolean(false), new Integer(123), new Double(50.5)},
                    {"Aha aha aha aha", new Boolean(true), new Integer(12), new Double(50.6)},
                    {"Oho", new Boolean(true), new Integer(12), new Double(12.45)},
                    {"Aha", new Boolean(true), new Integer(123), new Double(12.45)}
        },
                new String [] {"String", "Boolean", "Integer", "Double"}
        ) {
            Class[] types = new Class [] {String.class, Boolean.class, Integer.class, Double.class};
            public Class getColumnClass(final int columnIndex) {return types [columnIndex];}
        });
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        pack();
    }
    private boolean goodValue(final int row, final int column){
        Object o = table.getValueAt(row, column);
        switch(column){
            case 0:
                String str = (String) o;
                if(str.length() < 11) return true;
                break;
            case 1:
                str = (String) table.getValueAt(row, 0);
                boolean b = ( (Boolean)o ).booleanValue();
                if(!b | (b && !str.equalsIgnoreCase("oho")) ) return true;
                break;
            case 2:
                int i = ( (Integer)o ).intValue();
                if(i < 101) return true;
                break;
            case 3:
                double d = ( (Double)o ).doubleValue();
                if(d < 50.6)return true;
                break;
        }
        return false;
    }
    public static void main(final String args[]) {new TabelleFaerbenDemo().setVisible(true);}
}
```


----------



## Gast (27. Apr 2007)

Kann bei oben erwähnter Struktur von Model - View - Controller gesprochen werden ?


----------



## André Uhres (27. Apr 2007)

Gast hat gesagt.:
			
		

> Kann bei oben erwähnter Struktur von Model - View - Controller gesprochen werden ?


Wenn du mein Beispiel meinst: DefaultTableModel ist das Model, JTable ist die View und TabelleFaerbenDemo ist der Controller.


----------



## Wildcard (27. Apr 2007)

André Uhres hat gesagt.:
			
		

> Wenn du mein Beispiel meinst: DefaultTableModel ist das Model, JTable ist die View und TabelleFaerbenDemo ist der Controller.


JTable ist ein Controller der mit einer View kommuniziert.


----------



## André Uhres (27. Apr 2007)

Wildcard hat gesagt.:
			
		

> ..JTable ist ein Controller der mit einer View kommuniziert.


Also JTable ist View und Controller?


----------



## Wildcard (27. Apr 2007)

Nein, eine JTable ist ein Controller.
Die TableUI ist die View.


----------



## André Uhres (27. Apr 2007)

Wildcard hat gesagt.:
			
		

> Nein, eine JTable ist ein Controller.
> Die TableUI ist die View.


Das leuchtet ein. Danke für die Antwort.


----------



## derToby (27. Apr 2007)

Vielen Dank euch allen. Hat mir sehr geholfen, die Thematik tiefer zu verstehen. Das FAQ ist echt klasse !!!


----------

