# JTable - zentrieren



## leni (27. Feb 2006)

Hallo,

Ich möchte gerne in einer Spalte meiner JTable in allen Zeilen den Inhalt zentriert darstellen. Weiß jemand wie man das definiert?  :bahnhof: 

leni


----------



## André Uhres (27. Feb 2006)

```
table = new JTable( model ) {
            public Component prepareRenderer(
                    TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                ((DefaultTableCellRenderer)renderer).setHorizontalAlignment(SwingConstants.LEFT);
                if(column==1)
                    ((DefaultTableCellRenderer)renderer).setHorizontalAlignment(SwingConstants.CENTER);
                return c;
            }
        };
```


----------



## Raphalon (20. Mrz 2006)

Hallo,

bin noch Anfänger und verstehe den Code nicht ganz, v.a. die zwei Zeilen 


```
table = new JTable( model ) {
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
                ==> Component c = super.prepareRenderer(renderer, row, column); <==
                if(column==1) 
                    ==> ((DefaultTableCellRenderer)renderer).setHorizontalAlignment(SwingConstants.CENTER); <==
                return c; 
            } 
        };
```


1.) Könnte mir diese jemand kurz erklären?
2.) Habe einen eigenen Renderer abgeleitet, doch ist das aufwändiger und lt. dem "Handbuch der Java-Programmierung, 4. Auflage" "recht ineffizient und belastet den Garbage Collector". Entsteht das mit dem von Andre vorgeschlagenen Code nicht auch? 
3.) Wie ist es möglich, in einem JTable das Selektionsmodell auf SINGLE_SELECTION zu bestimmen und dennoch eine Zeile direkt nach dem Programmstart vorzuselektieren? 

Gruß,

Raphalon


----------



## TRunKX (21. Mrz 2006)

Wieso fuchtelst du dich mit dem Renderer tot?

kann man nicht im TableModel einfach das allignement setzen? Habe gerade kein eclipse aber ich meine mich errinern zu können das das einfacher und besser geht!


----------



## André Uhres (21. Mrz 2006)

TRunKX hat gesagt.:
			
		

> ...kann man nicht im TableModel einfach das allignement setzen?...


Nein, ein TableModel hat nichts mit der Formatierung der Daten zu tun .


----------



## André Uhres (21. Mrz 2006)

Raphalon hat gesagt.:
			
		

> 1.) Könnte mir diese jemand kurz erklären?
> ==> Component c = super.prepareRenderer(renderer, row, column); <==
> ==> ((DefaultTableCellRenderer)renderer).setHorizontalAlignment(SwingConstants.CENTER); <==


a) gibt dir eine Referenz auf die Komponente die die Zelle darstellt, mit c.setBackground() 
kannste z.B. den Hintergrund der Zelle einstellen.
b) "renderer" ist eine Refrenz auf den Renderer der hier vorbereitet wird, 
"setHorizontalAlignment(SwingConstants.CENTER)" ist glaube ich selbsterklärend.



			
				Raphalon hat gesagt.:
			
		

> 2.) Habe einen eigenen Renderer abgeleitet, doch ist das aufwändiger und lt. dem
> "Handbuch der Java-Programmierung, 4. Auflage" "recht ineffizient und belastet den
> Garbage Collector". Entsteht das mit dem von Andre vorgeschlagenen Code nicht auch?


Ich bin mir nicht ganz sicher, aber ich denke prepareRenderer() ist effizienter. Jedenfalls ist es hier einfacher.
Und weitere Alternativen gibt's sowieso nicht.


			
				Raphalon hat gesagt.:
			
		

> 3.) Wie ist es möglich, in einem JTable das Selektionsmodell auf SINGLE_SELECTION zu bestimmen
> und dennoch eine Zeile direkt nach dem Programmstart vorzuselektieren?


Wo ist da der Widerspruch?


----------



## Raphalon (21. Mrz 2006)

André Uhres hat gesagt.:
			
		

> b) "renderer" ist eine Refrenz auf den Renderer der hier vorbereitet wird,
> "setHorizontalAlignment(SwingConstants.CENTER)" ist glaube ich selbsterklärend.


Was versteht man unter dem Begriff „vorbereiten“ bzw. “Prepares the renderer by querying the data model for the value and selection state of the cell at row, column.” Was für ein Prozeß läuft dabei ab? 



			
				André Uhres hat gesagt.:
			
		

> Ich bin mir nicht ganz sicher, aber ich denke prepareRenderer() ist effizienter. Jedenfalls ist es hier einfacher.
> Und weitere Alternativen gibt's sowieso nicht.


Wenn Du schreibst, es gibt keine Alternativen, was meinst Du damit? Ich habe einen Renderer aus der Klasse DefaultTableCellRenderer abgeleitet und das funktioniert auch, nur umständlicher. 



			
				André Uhres hat gesagt.:
			
		

> Wo ist da der Widerspruch?


Wenn ich das Selektionsmodell auf SINGLE_SELECTION setze und das Programm starte, ist zunächst keine Zeile selektiert. Dies geschieht erst dann, wenn ich mit der Maus eine selektiere.


----------



## André Uhres (21. Mrz 2006)

>Was versteht man unter dem Begriff „vorbereiten“ 
Das bestimmst du selbst was du in der Methode machen willst. 
Typisch sind zeilenabhängige und tabellenabhängige Darstellungen 
(Zeilen einfärben, Rand der selektierten Zelle, ...).
Die Methode wird von der JTable API systematisch aufgerufen wenn sie benötigt wird um die
Tabelle zu zeichnen.

>Wenn Du schreibst, es gibt keine Alternativen, was meinst Du damit? 
Ich meine natürlich ausser Renderer und prepareRenderer.

>Wenn ich das Selektionsmodell auf SINGLE_SELECTION setze und das Programm starte, ist zunächst keine Zeile
 >selektiert. Dies geschieht erst dann, wenn ich mit der Maus eine selektiere.
Du kannst die Zeile per Programmanweisung selektieren. Hat aber nichts direkt mit dem
Selektionsmodus zu tun, den du gewählt hast.


----------

