JTable und bold Text

Weisswurst

Aktives Mitglied
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
Java:
public Class<?> getColumnClass(int col) {
		switch (col) {
		case 0:
			return String.class;
		case 1:
			return Integer.class;
			.......

Auszug CellRenderer
Java:
@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
 
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 🙂
 
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...
 
Hmm, komisch, ich hab den Renderer für Object gesetzt.
Java:
table.setDefaultRenderer(Object.class, new BoldTableCellRenderer());

Dachte eigentlich, da ja alles irgendwie von Object abgeleitet ist müsste das passen.
 
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...
 
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:

[TABLE="head"]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]
[/table]
Ebenius
 

Zurück
Oben