# Probleme mit SWT und Layout



## Gast1 (27. Mrz 2007)

Hallo,

ich fange gerade an mit SWT und vermisse hier ein Statusbar Element. Daher dachte ich mir, ich löse es über ein Label.
Nut wie bekomme ich das ganze jetzt so positioniert, das die Statusbar immer unten im Fenster ist? Mein Fenster enthält ein sashForm in der links eine expandBar und rechts momentan noch ein Composite drin ist.

Nun hätte ich gerne das das sashForm natürlich immer so hoch ist wie mein Fenster, aber natürlich unten im Fenster noch das Statuslabel. Ich poste euch mal einen Auszug aus meiner createContents:


```
shell = new Shell(display,SWT.MIN | SWT.CLOSE | SWT.TITLE | SWT.SYSTEM_MODAL | SWT.BORDER | SWT.MAX | SWT.RESIZE);
           shell.setLayout(new FillLayout(SWT.VERTICAL));
           shell.setText("Startprogramm");
		
           sashForm = new SashForm(shell, SWT.NONE);
           createExpandBar(sashForm);
        
           composite_1 = new Composite(sashForm, SWT.BORDER);
         
           sashForm.setBounds(shell.getClientArea());
           sashForm.setWeights(new int[] {35, 160 });
           
           StatusBar mystat = new StatusBar( shell, SWT.CENTER );
		
		shell.addControlListener(new ControlAdapter() {
			public void controlResized(ControlEvent e) {
				 sashForm.setBounds(shell.getClientArea());
			}
		});
```

Mein Problem ist nun, das die Statusbar halb so hoch ist wie das gesamte Fenster.


Wie bekomme ich sie klein?


----------



## mikachu (27. Mrz 2007)

StatusBar?

ist das eine klasse von dir?
ich hab die nicht bei mir im swt-package :roll:


----------



## Gast1 (27. Mrz 2007)

Ja ist sie.
Macht aber im Prinzip nur zwei Labels nebeneinander.


----------



## Gast1 (27. Mrz 2007)

So hier noch die Klasse StatusBar:


```
public class StatusBar extends Composite {
 
	 private Label statusText;
	 private Label statusBurner;

	 public StatusBar(Composite parent, int style) {
		 super(parent, style);

		 GridLayout gl = new GridLayout();
		 gl.numColumns = 3;
		 setLayout(gl);

		 statusText = new Label(this, SWT.NULL);
		 statusText.setText("Default Statusbar Text");
 
		 Composite fill = new Composite(this, SWT.NONE) {
			 public Point computeSize(int wHint, int hHint, boolean
					 changed) {
				 		return new Point(wHint, 0);
			 		}
		 	};
 
		 	GridData gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
		 	fill.setLayoutData(gd);
		 	
		 	statusBurner = new Label(this, SWT.BORDER);
		 	updateStatusBurner( "hallo welt");
		 	
	 }


	 public void updateStatusText(String s) {
		 statusText.setText(s);
		 pack();
	 }

	 public void updateStatusBurner(String sText) {

		 try {
			 statusBurner.setText(sText);
		 }
		 catch (IllegalArgumentException e) { System.out.println(e); }
		 pack();
	 }
 }
```


----------



## mikachu (27. Mrz 2007)

Hmm, hast du dir schonmal die Javadoc von FillLayout durchgelesen?


> FillLayout is the simplest layout class. It lays out controls in a single row or column, forcing them *to be the same size*.



Das würde so einiges erklären.
Nimm einfach nen anderen LayoutManager dafür :wink:

Mit dem GridBagLayout kannst du ziemlich frei gestalten!


----------



## Guest (27. Mrz 2007)

Ja das Problem ist aber das ich hier SWT verwende.
wenn ich da versuche 

```
shell.setLayout( new GridBagLayout() );
```

gibts nen Fehler. Es gehen nur FillLayout, RowLayout udn FormLayout soweit ich weiß.
Und mit den genannten bekomme ich es einfach nicht ordentlich hin.[/code]


----------



## Gast1 (27. Mrz 2007)

Ja das Problem ist aber das ich hier SWT verwende.
wenn ich da versuche 

```
shell.setLayout( new GridBagLayout() );
```

gibts nen Fehler. Es gehen nur FillLayout, RowLayout udn FormLayout soweit ich weiß.
Und mit den genannten bekomme ich es einfach nicht ordentlich hin.[/code]


----------



## mikachu (27. Mrz 2007)

die Klasse GridBagLayout() liegt, genau wie die anderen LayoutManager, im java.awt-Paket.
Der Vorteil von GridBagLayout() ist, dass man dann noch GridBagConstraints() mit angeben kann, wie sich die einzelne, spezielle Komponente verhalten soll.

Ist zwar ein wenig mehr Codier-aufwand, aber lohnt sich auf jeden Fall.


----------



## Gast1 (27. Mrz 2007)

Das ist nicht mein Problem.

Die Methode setlayout nimmt als Parameter kein anderes als die genannten Layouts an


----------



## mikachu (27. Mrz 2007)

Da ist das aber nicht die Shell aus org.eclipse.swt.widgets.*
Denn das GridBagLayout wird seit JDK 1.0 supported.

Aber mit dem FormLayout geht das auf jeden Fall, weil das ist der Diamant unter den LayoutManagern


----------



## Gast1 (27. Mrz 2007)

Doch sollte genau diese Shell sein.
Ja nur leider hab ich mich noch nicht genau mit dem FormLayout beschäftigt.

So wie ich es verstanden habe, gibt man dort für jedes Element die Beziehung zum nächsten an.


----------



## mikachu (27. Mrz 2007)

Das ist richtig, aber ich hab mich auch noch nicht damit auseinandergesetzt.

Hast du das GridLayout schonmal in Verbindung mit GridData probiert?
Es besitzt auf den ersten Blick einen Großteil der Funktionalität von GridBagLayout und liegt mit im org.eclipse.swt.layout.* paket!

*FillLayout
FormAttachment
FormData
FormLayout
GridData
GridLayout
RowData
RowLayout*
die gibbet alle im o.g. paket :wink:

#edit
als ich mit SWT rumhantiert habe, benutzte ich immer das GridBagLayout aus dem java.awt-Paket...
Und es ging wunderbar. Darum kann ich mir ehrlich gesagt nicht vorstellen, warum das bei dir nicht gehen sollte!


----------



## ps2aich (29. Mrz 2007)

Hi, probiere mal das GridLayout, ungefähr so:


```
shell = new Shell(display,SWT.MIN | SWT.CLOSE | SWT.TITLE | SWT.SYSTEM_MODAL | SWT.BORDER | SWT.MAX | SWT.RESIZE);
           shell.setLayout(new GridLayout());
           shell.setText("Startprogramm");
		
           sashForm = new SashForm(shell, SWT.NONE);
           {
                  GridData data = new GridData(GridData.FILL_BOTH);
                  sashForm.setLayoutData(data);
           }
           StatusBar statusBar = createExpandBar(sashForm);
           {
                  GridData data = new GridData(GridData.FILL_HORIZONTAL);
                  statusBar.setLayoutData(data);
           }
        
           composite_1 = new Composite(sashForm, SWT.BORDER);
         
           sashForm.setBounds(shell.getClientArea());
           sashForm.setWeights(new int[] {35, 160 });
           
           StatusBar mystat = new StatusBar( shell, SWT.CENTER );
		
		shell.addControlListener(new ControlAdapter() {
			public void controlResized(ControlEvent e) {
				 sashForm.setBounds(shell.getClientArea());
			}
		});
```

Der SashForm sagt man mit dem GridData(GridData.FILL_BOTH), dass sie sowohl horizontal als
auch vertikal den maximal verfügbaren Raum einnehmen soll.
Der StatusBar sagt man mit GridData(GridData.FILL_HORIZONTAL), dass sie nur horizontal
den maximalen Raum einnehmen soll.
Ohne es direkt ausprobiert zu haben, sollte nun die StatusBar unten sein.


----------



## Gast1 (30. Mrz 2007)

Hallo,

das klappt super! Genau so sollte es sein.
Vielen Dank.


----------



## byte (30. Mrz 2007)

Du kannst auch statt einer Shell ein *org.eclipse.jface.window.ApplicationWindow* verwenden. Dort ist schon alles mögliche vorgesehen, unter anderem auch das Hinzufügen einer StatusBar (bzw. StatusLine genannt).


----------

