# JTable und bold Text



## Weisswurst (22. Jan 2010)

Hi!

Ich habe eine JTable in der ich ein abgeleitetes AbstractTableModel zur Datenhaltung verwende.
Ausserdem habe ich einen eigenen CellRenderer mit dem ich einige Einträge in der Tabelle "bold" darstellen lasse.
Das funktioniert soweit auch. Leider nur für Felder deren Inhalte vom Tyo String sind.

Auszug Tablemodel

```
public Class<?> getColumnClass(int col) {
		switch (col) {
		case 0:
			return String.class;
		case 1:
			return Integer.class;
			.......
```

Auszug CellRenderer

```
@Override
	 public Component getTableCellRendererComponent(JTable table, Object value, 
             boolean isSelected, boolean hasFocus, int row, int column) {
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        Font font = component.getFont();
        int rowIndexModel = table.convertRowIndexToModel(row);
        component.setFont(font.deriveFont(Font.BOLD));
        return component;
}
```

Für die erste Spalte würd der Text fett, für die Zweite nicht. Fett gibts nur in Verbindung mit String. Aber ich kann ja nicht alle Felder auf String setzen.

Was tun?

Grüße
Wurstmann


----------



## Atze (22. Jan 2010)

naja, ist nur ne vermutung, aber hört sich logisch an, dass nur strings formatierbar sind. bold ist halt ne TEXTformatierung, und texte sind nunmal strings


----------



## Marco13 (22. Jan 2010)

Ne, nicht so... für Integers (Numbers) wird ein anderer Renderer verwendet, als für Strings. Da gibt's jetzt verschiedene Möglichkeiten... man müßte eigentlich sowas machen können wie
[c]table.setDefaultRenderer(Integer.class, theRenderer);[/c]
aber es gibt da noch einige Alternativen...


----------



## Weisswurst (22. Jan 2010)

Hmm, komisch, ich hab den Renderer für Object gesetzt.

```
table.setDefaultRenderer(Object.class, new BoldTableCellRenderer());
```

Dachte eigentlich, da ja alles irgendwie von Object abgeleitet ist müsste das passen.


----------



## Atze (22. Jan 2010)

ok, war ja nur ne vermutung


----------



## Marco13 (22. Jan 2010)

Ohne KSKB ist das ein bißchen schwierig. Man kann den Renderer auch für die TableColumns gezielt setzen, kannst ja mal schauen, ob das hilft...


----------



## Ebenius (24. Jan 2010)

Die JTable holt sich immer den konkretesten DefaultRenderer. Für [c]String[/c] ist keiner gesetzt, weil der für [c]Object[/c] für [c]String[/c] verwendet wird. Die Tabelle sieht also: Oh ein String... Hab ich dafür einen Renderer? Nein. Wie ist die Super-Klasse für [c]String[/c]? [c]Object[/c]. Hab ich dafür einen Renderer? Jupp. Dann nehm ich den mal.

Für [c]Integer[/c] läuft es genauso: Hab ich einen Renderer für [c]Integer[/c]? Nö. Wie ist denn die Super-Klasse für [c]Integer[/c]? Ahja, [c]Number[/c]. Hab ich dafür einen Renderer? Jupp. Dann nehme ich den mal. Der Renderer den Du für [c]Object[/c] gesetzt hast kommt dann nicht zum Zug.

Eine nackelige [c]JTable[/c] hat Standard-Renderer für folgende Klassen:



Spalten-Klasse|Renderer-Klasse
[c]Object.class[/c]|[c]javax.swing.table.DefaultTableCellRenderer$UIResource[/c]
[c]Number.class[/c]|[c]javax.swing.JTable$NumberRenderer[/c]
[c]Float.class[/c]|[c]javax.swing.JTable$DoubleRenderer[/c]
[c]Double.class[/c]|[c]javax.swing.JTable$DoubleRenderer[/c]
[c]Date.class[/c]|[c]javax.swing.JTable$DateRenderer[/c]
[c]Icon.class[/c]|[c]javax.swing.JTable$IconRenderer[/c]
[c]ImageIcon.class[/c]|[c]javax.swing.JTable$IconRenderer[/c]
[c]Boolean.class[/c]|[c]javax.swing.JTable$BooleanRenderer[/c]
Ebenius


----------

