# Problem mit der Größe eines Dialogs mit ExpandBar



## Hullabaloo (16. Mai 2008)

Hallo,

ich bin relativ unerfahren in der Programmierung mit Swing und versuche zur Zeit, einen Dialog zu erstellen, in dem ich eine ExpandBar zur Darstellung einzelner Composites und Elemente nutze. Leider kommt es dabei immer wieder zu Problemen in der Größendarstellung.
Ich habe mal ein Bild hochgeladen, dass das Problem zeigt.






Im eingeklappten Zustand ist alles ok.
Wenn ich ein ExpandItem ausklappe gibt es zwei Möglichkeiten.

Definition der Höhe über


```
itemTaskInfo.setHeight(comp.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
```

Das führt dazu, dass man nichts von dem Item sehen kann.


```
itemTaskInfo.setHeight(200);
```

Das führt dazu, dass Scrollbalken eingeblendet werden. 

Im Idealfall hätte ich es gerne, dass sich beim Aufklappen das einzelne Item so weit vergrößert wie notwendig und der rest des Dialogs nach unten verschoben wird. Eingeklappt soll es so bleiben, wie es ist. 
Ich finde aber den Fehler nicht.

Hier mal ein Codeausschnitt. Falls ich weitere Infos liefern soll/ kann einfach sagen. Ich möcht ja nicht das Forum mit meinem Code zuspammen 


```
private void buildGUI() 
	{
	                labelLogo = new Label(specGUI, SWT.BORDER);
			labelLogo.setImage(ImageConstants.PROTOTYPE_WISELOGO);
			labelLogo.setAlignment(SWT.RIGHT);
			labelLogo.setBackground(display.getSystemColor(SWT.COLOR_WHITE));

			ExpandBar bar = new ExpandBar (specGUI, SWT.V_SCROLL);
			bar.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
			bar.setForeground(display.getSystemColor(SWT.COLOR_RED));
			
			compTaskInfo = new Composite (bar, SWT.NONE);
			compTaskInfo.setLayout(new GridLayout (2, true));
			
			compObjectInfo = new Composite (bar, SWT.NONE);
			compObjectInfo.setLayout(new GridLayout (2, true));

			compObjectEdit = new Composite (specGUI, SWT.BORDER);
			compObjectEdit.setLayout(new GridLayout (1, false));
		
			compButtons = new Composite(specGUI, SWT.NONE);
			compButtons.setLayout(new FillLayout());
			
			buildTaskInfo(bar,compTaskInfo);
			buildObjectInfo(bar,compObjectInfo);
			buildObjectDefinition(compObjectEdit);
			buildButtons(compButtons);
                       
                        specGUI.pack();
		        specGUI.open();
	}
	
		private void buildTaskInfo(ExpandBar bar, Composite comp)
		{
			ExpandItem itemTaskInfo = new ExpandItem (bar, SWT.NONE, 0);
			itemTaskInfo.setText(GUIConstants.SPEC_TASKINFO);
			itemTaskInfo.setExpanded(true);
			itemTaskInfo.setHeight(200);
			itemTaskInfo.setControl(comp);
			itemTaskInfo.setImage(ImageConstants.ICON_INFORMATION);
			
			labelName = new Label(comp, SWT.NONE);
			labelName.setText(GUIConstants.SPEC_TASKNAME);
			textName = new Text(comp, SWT.NONE);
			textName.setText("Aufgabenname");
			
			labelDescription = new Label(comp, SWT.NONE);
			labelDescription.setText(GUIConstants.SPEC_DESCRIPTION);
			textDescription = new Text(comp, SWT.NONE);
			textDescription.setText("Aufgabenbeschreibung");
			
			labelRoles = new Label(comp, SWT.NONE);
			labelRoles.setText(GUIConstants.SPEC_ROLES);
			textRoles = new Text(comp, SWT.NONE);
			textRoles.setText("Zugewiesene Rollen");
		}
```

Kann mir vielleicht jemand einen Denkanstoss geben? Wie kann ich das lösen? Wie muss ein Listener dafür aussehen.
Als Layout für den Dialog benutz ich eine Art vertikales FillLayout namens ColumnLayout.


----------



## Hullabaloo (17. Mai 2008)

Ok mein Code hat sich mittlerweile geändert. Jetzt funktioniert es auch FAST. Das einzige Problem ist, dass der Abstand zwischen den beiden ExpandItems zu klein ist. Wenn ich das Spacing der Bar erhöhe geht es. Allerdings ist dann der Abstand von Bar zum nächstem Composite zu hoch. Hier der Code. SpecGUI ist die Shell in der sich die Bar befindet.


```
final ExpandBar bar = new ExpandBar (specGUI, SWT.NONE);
			bar.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
			bar.setForeground(display.getSystemColor(SWT.COLOR_RED));
			bar.setSpacing(8);
			bar.addExpandListener(new ExpandAdapter() {
				public void itemCollapsed(final ExpandEvent e) {
					display.asyncExec(new Runnable() {
						public void run() {
							bar.getParent().layout();
							specGUI.pack();
						}
					});
				}


				public void itemExpanded(final ExpandEvent e) {
					display.asyncExec(new Runnable() {
						public void run() {
							bar.getParent().layout();
							specGUI.pack();
						}
					});
				}
			});
			
			compTaskInfo = new Composite (bar, SWT.NONE);
			compTaskInfo.setLayout(new GridLayout (2, true));
			
			compObjectInfo = new Composite (bar, SWT.NONE);
			compObjectInfo.setLayout(new GridLayout (2, true));

			compObjectEdit = new Composite (specGUI, SWT.BORDER);
			compObjectEdit.setLayout(new GridLayout (1, false));
		
			compButtons = new Composite(specGUI, SWT.NONE);
			compButtons.setLayout(new FillLayout());
			
			buildTaskInfo(bar,compTaskInfo);
			buildObjectInfo(bar,compObjectInfo);
			buildObjectDefinition(compObjectEdit);
			buildButtons(compButtons);
		;
	}
	
	private void buildTaskInfo(ExpandBar bar, Composite comp)
	{
			ExpandItem itemTaskInfo = new ExpandItem (bar, SWT.NONE, 0);
			itemTaskInfo.setText(GUIConstants.SPEC_TASKINFO);
			itemTaskInfo.setExpanded(true);
			itemTaskInfo.setHeight(bar.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
			itemTaskInfo.setControl(comp);
			itemTaskInfo.setImage(ImageConstants.ICON_INFORMATION);
			
			labelName = new Label(comp, SWT.NONE);
			labelName.setText(GUIConstants.SPEC_TASKNAME);
			textName = new Text(comp, SWT.NONE);
			textName.setText("Aufgabenname");
			textName.setEnabled(false);
			
			labelDescription = new Label(comp, SWT.NONE);
			labelDescription.setText(GUIConstants.SPEC_DESCRIPTION);
			textDescription = new Text(comp, SWT.NONE);
			textDescription.setEnabled(false);
			textDescription.setText("Aufgabenbeschreibung");
			
			labelRoles = new Label(comp, SWT.NONE);
			labelRoles.setText(GUIConstants.SPEC_ROLES);
			textRoles = new Text(comp, SWT.NONE);
			textRoles.setEnabled(false);
			textRoles.setText("Aufgabenbeschreibung");
			
		}

		private void buildObjectInfo(ExpandBar bar, Composite comp)
		{
			ExpandItem itemObjectInfo = new ExpandItem (bar, SWT.NONE, 1);
			itemObjectInfo.setText(GUIConstants.SPEC_OBJECTINFO);
			itemObjectInfo.setHeight(bar.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
			itemObjectInfo.setControl(comp);
			itemObjectInfo.setImage(ImageConstants.ICON_INFORMATION);
			itemObjectInfo.setExpanded(false);
			
			labelObjectName = new Label(comp, SWT.NONE);
			labelObjectName.setText(GUIConstants.SPEC_OBJECTNAME);
			textObjectName = new Text(comp, SWT.NONE);
			textObjectName.setEnabled(false);
			textObjectName.setText("Objektname");
			
			labelObjectDescription = new Label(comp, SWT.NONE);
			labelObjectDescription.setText(GUIConstants.SPEC_DESCRIPTION);
			textObjectDescription = new Text(comp, SWT.NONE);
			textObjectDescription.setEnabled(false);
			textObjectDescription.setText("Aufgabenbeschreibung");
			
			labelTasks = new Label(comp, SWT.NONE);
			labelTasks.setText(GUIConstants.SPEC_TASKS);
			textTasks = new Text(comp, SWT.MULTI);
			textTasks.setEnabled(false);
			textTasks.setText("Zugewiesene Aufgaben");
		}
```


----------



## Wildcard (17. Mai 2008)

Den Abstand zwischen 2 Controls solltest du über des Layout des Parent Composites steuern.


----------

