# JTable automatisch vergrößern wenn das zugehörige JFrame vergrößert wird



## aze (24. Jul 2009)

Hi

Wie schaffe ich es ,dass eine JTable sowohl in der Größe als auch in der Breite vergrößert wird,wenn das zugehörige JFrame vergrößert wird ?


----------



## SlaterB (24. Jul 2009)

per Layout


----------



## aze (24. Jul 2009)

SlaterB hat gesagt.:


> per Layout



Wie meinst du das ?


----------



## SlaterB (24. Jul 2009)

wenn du die JTable in bestimmten Layouts eingefügt hast, z.B. das Standard-BorderLayout, dann wird es den ganzen Platz einnehmen,
bei anderen Einstellungen evtl. nicht,

ohne Code läßt sich daher übrigens nicht sagen, was bei dir falsch ist


----------



## Verjigorm (24. Jul 2009)

Worin addest du deine JTable?
Und welches Layout hat dieser Container?

benutzt du zufällig Null-Layout?


----------



## aze (24. Jul 2009)

Bisher hab ich das Boxlayout verwendet:


```
...
setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS));
...
add table();
```


----------



## aze (24. Jul 2009)

SlaterB hat gesagt.:


> wenn du die JTable in bestimmten Layouts eingefügt hast, z.B. das Standard-BorderLayout, dann wird es den ganzen Platz einnehmen,
> bei anderen Einstellungen evtl. nicht,
> 
> ohne Code läßt sich daher übrigens nicht sagen, was bei dir falsch ist



Ich hab jetzt mal das BorderLayout genommen und die Tabelle im zentrum eingefügt:


```
setLayout(new BorderLayout());
add(_table,BorderLayout.CENTER);
```

In die Breite vergrößert sich die Tabelle dann auch beim Resize ,aber nicht in der Höhe.

Edit:Rechtschreibfehler entfernt


----------



## SlaterB (24. Jul 2009)

gut, nicht höher, als die vorhandenen Zeilen Platz brauchen, 
die Zeilenhöhe müßte man wohl manuell anpassen


----------



## aze (24. Jul 2009)

Ich hab es mal mit einen ComponentAdapter versucht: 


```
private class ResizeTableListener extends ComponentAdapter
	{
		
		@Override
		public void componentResized(ComponentEvent e) 
		{
			int height = _table.getHeight();
		
	    	_table.setRowHeight(height + 1);
	    	
	    	_table.repaint();
			
			super.componentResized(e);
		}
		
	}
```


Allerdings wird dann nur die erste Zeile vergrößert und der Rest verschwindet.Weiß jemand wieso ?


----------



## SlaterB (24. Jul 2009)

ich nicht,
 in einem vollständigen Testprogramm wäre es zumindest denkbar, es herauszufinden


----------



## aze (24. Jul 2009)

SlaterB hat gesagt.:


> ich nicht,
> in einem vollständigen Testprogramm wäre es zumindest denkbar, es herauszufinden



Hmm meinst du so etwas:


```
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;
import javax.swing.JTable;


public class Table 
{
	
	
	public static void main(String[] args)
	{
		String[][] rowData = {
			    { "Japan", "245" }, { "USA", "240" }, { "Italien", "220" },
			    { "Spanien", "217" }, {"Türkei", "215"} ,{ "England", "214" },
			    { "Frankreich", "190" }, {"Griechenland", "185" },
			    { "Deutschland", "180" }, {"Portugal", "170" }
			  };
			    String[] columnNames = {
			        "Land", "Durchschnittliche Sehdauer pro Tag in Minuten"
			    };
		
		
		JFrame frame = new JFrame();
		frame.setSize(200,200);
		
		final JTable table = new JTable(rowData,columnNames);
		
		
		table.addComponentListener(new ComponentAdapter()
		{
			
			@Override
			public void componentResized(ComponentEvent e) 
			{
				int height = table.getHeight();
			
		    	table.setRowHeight(height + 1);
		    	
		    	table.repaint();
				
				super.componentResized(e);
			}
			
			
		});
		
		frame.add(table);
		
		frame.setVisible(true);
		
	}

}
```


----------



## SlaterB (24. Jul 2009)

damit konnte ich das ganze gut ausprobieren, danke

dass nur eine Zeile zu sehen ist, wenn als Zeilenhöhe die gesamte Höhe der Table gesetz wurde, ist doch nicht so verwunderlich,
das hätte ich auch gleich erkennen können..

mit
table.setRowHeight(table.getSize().height/ table.getModel().getRowCount());
scheint es in dieser Konstellation gut zu klappen

evtl. könnte man noch Header herausrechnen usw.


----------



## aze (24. Jul 2009)

Hey,das klappt ja super.Vielen Dank.

:toll::toll::toll::toll:


----------



## Ebenius (24. Jul 2009)

SlaterB hat gesagt.:


> table.setRowHeight(table.getSize().height/ table.getModel().getRowCount());


Besser 
	
	
	
	





```
table.setRowHeight(table.getSize().height/ table.getRowCount());
```
Dann funktioniert es auch noch, wenn man die Tabellenansicht filtert.
Außerdem sollte man noch den Rahmen der Tabelle abziehen und eine Gridweite. Kann je nach LookAndFeel einiges ausmachen. Und man sollte noch beachten, dass es bei null Zeilen keine Division durch null gibt:

```
final Insets insets = table.getInsets();
final int rowCount = table.getRowCount();
if (rowCount == 0) {
  table.setRowHeight(25);
} else {
  final int tableHeight = table.getHeight() - insets.top - insets.bottom - table.getIntercellSpacing().height;
  table.setRowHeight(tableHeight / rowCount);
```
Dann bleibt natürlich immernoch das Problem, dass die Zeilen nicht hoch genug sind, wenn die Höhe nicht exakt durch die Zeilenzahl teilbar ist. Wenn man es exakt will, dann müsste man die Zeilenhöhe einzeln setzen und den Rundungsfehler entsprechend ausgleichen.

Ebenius


----------

