JTable Header L&F

VitiumJava

Mitglied
Hallo Zusammen,

kleines Problem.

In meinem kleinen Programm setzte ich am Anfang,

Java:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());


Des Weiteren habe ich eine JTable erstellt wo ich meinen eigenen Header mit
Java:
public class TableHeader extends JLabel implements TableCellRenderer { 

private static final long serialVersionUID = 6221428923597532143L;
	
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		
		JComponent c = null;
		if(value instanceof String) {
			c = new JLabel(value.toString());
            ((JLabel)c).setHorizontalAlignment(SwingConstants.CENTER);
		}
		
		c.setEnabled(true);
        c.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
        c.setOpaque(true);

		return c;
	}

}

erstelle.

Nach dem einsetzen des Header in die JTable ist leider der System look and Feel in der Tablle bzw. Header der Tabelle nicht mehr vorhanden bzw, wie vorher.

Wie kann ich das L&F der Tabelle wieder auf System L&F setzten? Oder wie es vorher war? Danke.
 

GUI-Programmer

Top Contributor
Code:
SwingUtilities.updateComponentTree(deineKomponente)
wobei deineKomponente hier vermutlich die JTable ist.
 

bERt0r

Top Contributor
Weist du warum es CellRenderer gibt? Weil es die Performance in den Keller jagen würde, wenn man für eine JTable mit 10000 Zellen auch 10000 Labels anlegen müsste. Der Sinn von einem Cell Renderer ist, dass man eben nur ein JLabel hat und Abbilder von ihm mit einem gewünschten Inhalt auf den Bildschirm zeichnet.
Du erstellst jedes mal ein neues Label in der "getTableCellRendererComponent". Die Methode heisst nicht createTableCellRendererComponent weil sie eben keinen neuen Component anlegen soll. Deine Klasse ist soll ein Renderer sein und keine Factory.
Du "extendest" ja sogar ein JLabel in deiner Klasse, verwendest aber keine einzige Funktion deiner Vaterklasse. So sollte ein Renderer aussehen:
Java:
public class TableHeader extends JLabel implements TableCellRenderer { 

    public TableHeader{
         super();
         this.setHorizontalAlignment(SwingConstants.CENTER);
         c.setEnabled(true);
         c.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
         c.setOpaque(true);
         }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        
        if(value instanceof String) {
            this.setText((String)value);
        }
        else{
        this.setText(null);
        }
        return this;
    }
 
}
 
Zuletzt bearbeitet:

VitiumJava

Mitglied
Ein Beispiel vorher und nachher ist zum Beispiel.

Ohne eine extra Header für die Tabelle:

1867d1319003573t-customize-jtable-header-jtable.jpg


Und nach dem Einfügen eines neuen Header für die Tabelle.

JTable3.gif


Wobei
Java:
SwingUtilities.updateComponentTree(deineKomponente)
nicht funktioniert.
 

VitiumJava

Mitglied
So,

Java:
public final class MyTable extends JTable {

  public MyTable() {

  init();

  }


private void init() {

  JTableHeader tableHeader = getTableHeader();
  tableHeader.setDefaultRenderer(new TableHeader()); 
  SwingUtilities.updateComponentTreeUI(this);

}
 

bERt0r

Top Contributor
"SwingUtilities.updateComponentTreeUI(this);" hat dort nichts verloren, das musst du nur machen wenn du dein LnF während der Laufzeit ändern willst.
 

VitiumJava

Mitglied
Ja, aber daran kann es nicht liegen. Es verändert sich nicht, on es da ist oder nicht.
Da ich da jetzt nicht weiter kommen und das alte L&F für den Header nicht hin bekommen und niemand eine Lösung hat, werde ich das erstmal so lassen.
 

bERt0r

Top Contributor
Solange du kein KSKB postest kann ich dein Problem auch nicht nachvollziehen.
edit: Guckst du hier, 5 minuten Aufwand, alles wie es sein soll
Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class TableHeaderKSKB extends JFrame
{
	
	private JPanel contentPane;
	private JTable table;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args)
	{
		try
		{
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Throwable e)
		{
			e.printStackTrace();
		}
		EventQueue.invokeLater(new Runnable()
			{
				public void run()
				{
					try
					{
						TableHeaderKSKB frame = new TableHeaderKSKB();
						frame.setVisible(true);
					} catch (Exception e)
					{
						e.printStackTrace();
					}
				}
			});
	}
	
	/**
	 * Create the frame.
	 */
	public TableHeaderKSKB()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JScrollPane scrollPane = new JScrollPane();
		contentPane.add(scrollPane, BorderLayout.CENTER);
		
		table = new JTable();
		table.setModel(new DefaultTableModel(new Object[][] { { "1", "3", "0" }, { "42", "12", "42" },
				{ "42", "3", null }, }, new String[] { "Sepp", "Frizt", "Franz" }));
		
		table.getTableHeader().setDefaultRenderer(new TableHeaderRenderer());
		
		scrollPane.setViewportView(table);
	}
	
	class TableHeaderRenderer extends JButton implements TableCellRenderer
	{
		
		public TableHeaderRenderer()
		{
			super();
		}
		
		@Override
		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
				boolean hasFocus, int row, int column)
		{
			
			if (value instanceof String)
			{
				this.setText((String) value);
			} else
			{
				this.setText(null);
			}
			return this;
		}
	}
}
 
Zuletzt bearbeitet:

hirsra

Aktives Mitglied
Hi,

ich habe gerade dasselbe Problem. Und ich habe heute die Lösung gefunden.

Das Problem ist das der Default-Header-Renderer nicht abgeleitet werden kann. Diese Klasse hat Sun, warum auch immer, irgendwie intern versteckt. (Vielleicht weil es L&F abhängig ist?!)

Die Lösung ist vor der Installation des eigenen Renderer sich den installierten zu holen.
Java:
table.getTableHeader().getDefaultRenderer()
Dieses übergibt man dann an den eigenen Renderer(z.B. im Konstruktor). Im eigenen Renderer in der Method getTableCellRendererComponent(...) wird der Aufruf nun zuerst an den gespeicherten DefaultHeaderRenderer delegiert.
Anschließend kann man noch eigene Einstellungen... im Renderer machen.

Nicht vergessen das Rendererobjekt selbst zurück zu geben.

Abschließend noch ein paar Codefragmente:

Zuerst die Ermittlung des DefaultHeaderRenderer und setzen des eigenen Renderer(MultisortTableCellRenderer)
Java:
                final JTableHeader tableHeader = table.getTableHeader();
                final TableCellRenderer defaultRenderer = tableHeader.getDefaultRenderer();

                tableHeader.setDefaultRenderer(new MultisortTableHeaderCellRenderer(defaultRenderer));

Und hier die entscheidende Methode im Renderer:
Java:
    public Component getTableCellRendererComponent(final JTable table,
                                                   final Object value,
                                                   final boolean isSelected,
                                                   final boolean hasFocus,
                                                   final int row,
                                                   final int column) {
        Component result

        result = this.defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        // z.B. eigene Aktionen
        setBorder(UIManager.getBorder("TableHeader.cellBorder"));

        return result;
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Swing JTable : Header der Spalten ergänzen mit caption (wie bei html-table) AWT, Swing, JavaFX & SWT 2
L JTable Permanent Header AWT, Swing, JavaFX & SWT 0
N Swing JTable mit Sorter: Keine Sortierung bei Klick in Header AWT, Swing, JavaFX & SWT 3
V Swing JTable Row Header AWT, Swing, JavaFX & SWT 6
P Swing In JTable Header auch an der linken Seite AWT, Swing, JavaFX & SWT 2
O Swing JTable Header AWT, Swing, JavaFX & SWT 2
Spin JTable Header wird nicht angezeigt ohne ScrollPane AWT, Swing, JavaFX & SWT 3
A JTable Header AWT, Swing, JavaFX & SWT 3
G Swing JTable Header neu initialisieren? AWT, Swing, JavaFX & SWT 2
G JTable Multiple Row Header Example - Probleme mit der Höhe der Zellen AWT, Swing, JavaFX & SWT 4
C Swing 1spaltige JTable ohne Header AWT, Swing, JavaFX & SWT 18
hdi Swing JTable: SortKeys und Header Column Width AWT, Swing, JavaFX & SWT 5
C jtable checkbox in header / spaltenüberschrift AWT, Swing, JavaFX & SWT 4
F Swing JTable Header modifizieren AWT, Swing, JavaFX & SWT 13
M Problem mit funktionellem JTable Header AWT, Swing, JavaFX & SWT 5
D Swing JTable, Header und Leerzeilen AWT, Swing, JavaFX & SWT 3
R JTable Header - will links kleines icon hinzufuegen..? AWT, Swing, JavaFX & SWT 6
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
C Swing JTable Header angelickt? AWT, Swing, JavaFX & SWT 4
eskimo328 JTable Zeilenumbruch im Header AWT, Swing, JavaFX & SWT 2
T 2JLabels in einen JTable Header AWT, Swing, JavaFX & SWT 2
A JTable Header + ScrollBar AWT, Swing, JavaFX & SWT 4
H JTable drucken mit Header AWT, Swing, JavaFX & SWT 4
G JTable und Header AWT, Swing, JavaFX & SWT 4
J JTable Zellen und Header AWT, Swing, JavaFX & SWT 2
D jTable Header zweizeilig? AWT, Swing, JavaFX & SWT 2
R JTable Mehrzeiliger Header zerstört JGoodies-Layout AWT, Swing, JavaFX & SWT 2
D JTable Header während Laufzeit ändern. AWT, Swing, JavaFX & SWT 3
D Jtable Header Höhe setzen ? AWT, Swing, JavaFX & SWT 2
D Header für den Row Header (JTable) AWT, Swing, JavaFX & SWT 2
O Probleme mit header von JTable AWT, Swing, JavaFX & SWT 6
L Checkbox in JTable (again), bei true Daten in Header AWT, Swing, JavaFX & SWT 7
D Mehrzeilige JTable Header AWT, Swing, JavaFX & SWT 2
N Jtable header fixieren AWT, Swing, JavaFX & SWT 2
K Kein Header in JTable ! AWT, Swing, JavaFX & SWT 8
F Die JTable und ihr Header AWT, Swing, JavaFX & SWT 5
J JTable - Header über mehrere Spalten AWT, Swing, JavaFX & SWT 3
G JTable sortieren durch click im Header AWT, Swing, JavaFX & SWT 9
J Border im Header bei JTable verändern AWT, Swing, JavaFX & SWT 3
S JTable Header AWT, Swing, JavaFX & SWT 5
K JTable - Header colspan AWT, Swing, JavaFX & SWT 7
K JTable header updated nicht immer AWT, Swing, JavaFX & SWT 5
A JTable - Header wird nicht angezeigt AWT, Swing, JavaFX & SWT 8
D JTable Header AWT, Swing, JavaFX & SWT 2
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben