Wiedermal SWT-Layout-Problem

Status
Nicht offen für weitere Antworten.

Solour

Aktives Mitglied
Hey,

ich hab da eine kleine GUI, leider ist mir (offensichtlich) nicht klar, wie dieses FormLayout funktioniert... 🙁

Ziel ist:
lName tfObjectName
cbAbstract lCardinalities tfMin tfMax
lAttributeTypes
table
bAdd bDelete
bAccept bAbort

Die buttons bAdd, bDelete, bAccept und bAbort unten werden schon richtig angezeigt.
Die table hängt auch darüber.
Alles was weiter oben ist wird irgendwie nicht/ganz komisch angezeigt..
tfMin und tfMax sollen gleich breit sein und den rest der "zeile" ausfüllen.

Wäre ein GridLayout vllt. besser? Ich hab gelesen, das sich beim FormLayout die Komponenten nicht von selbst anpassen?

Hier ein kleines Beispiel meiner GUI. Wenn man sich die anweisungen für das vermurkste layout wegdenkt ists ja auch nicht soo viel 😉

Ciao


/edit: hier meine lösung, falls das mal jemand braucht 😉

Code:
package tableTest2;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;

public class Test {

	public static void main(String[] args) {
		Shell shell = new Shell();
		// Set layout for shell
		shell.setLayout(new FormLayout());
		shell.setSize(500, 300);
		// Create a composite to hold the children
		Composite composite = new Composite(shell, SWT.NONE);
		new Test(composite);
		shell.pack();
		shell.open();
		Display display = shell.getDisplay();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
	}

	private Button cbAbstract;

	// Set column names
	private String[] columnNames = { "value", "type" };

	private Table table;

	private Text tfMax;

	private Text tfMin;

	private Text tfObjectName;

	public Test(final Composite parent) {
		parent.setLayout(new FormLayout());

		final Button bAccept;
		final Button bAbort;
		final Button bAdd;
		final Button bDelete;
		final Label lName;
		final Label lCardinalities;
		final Label lAttributeTypes;
		final Composite cards = new Composite(parent, SWT.NULL);
		cards.setLayout(new FormLayout());
		// create components
		{
			// numb labels
			lName = new Label(parent, SWT.NULL);
			lCardinalities = new Label(parent, SWT.NULL);
			lAttributeTypes = new Label(parent, SWT.NULL);
			lName.setText("Name:");
			lCardinalities.setText("Cardinalities:");
			lAttributeTypes.setText("AttributeTypes:");
			// buttons and fields
			tfObjectName = new Text(parent, SWT.BORDER);
			cbAbstract = new Button(parent, SWT.CHECK);
			tfMin = new Text(cards, SWT.BORDER);
			tfMax = new Text(cards, SWT.BORDER);
			// create the table
			{
				table = new Table(parent, SWT.SINGLE | SWT.BORDER
						| SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION
						| SWT.HIDE_SELECTION);

				table.setLinesVisible(true);
				table.setHeaderVisible(true);
				TableColumn column = new TableColumn(table, SWT.LEFT, 0);
				column.setText(columnNames[0]);
				column.setWidth(450 / 2);

				column = new TableColumn(table, SWT.LEFT, 1);
				column.setText(columnNames[1]);
				column.setWidth(450 / 2);
			}
			bAdd = new Button(parent, SWT.PUSH | SWT.CENTER);
			bDelete = new Button(parent, SWT.PUSH | SWT.CENTER);
			bAccept = new Button(parent, SWT.PUSH | SWT.CENTER);
			bAbort = new Button(parent, SWT.PUSH | SWT.CENTER);
			cbAbstract.setText("Abstract?");
			bAccept.setText("Accept");
			bAbort.setText("Abort");
			bAdd.setText("Add");
			bDelete.setText("Delete");
		}
		// layout components
		{
			FormData data = new FormData();
			// center vertically, to top of tfObjectName!
			data.top = new FormAttachment(tfObjectName, 0, SWT.CENTER);
			data.left = new FormAttachment(0, 0);
			data.bottom = new FormAttachment(cbAbstract);
			lName.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(0, 0);
			data.left = new FormAttachment(lName, 5);
			data.right = new FormAttachment(100, 0);
			tfObjectName.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(tfObjectName, 5);
			data.left = new FormAttachment(0, 0);
			cbAbstract.setLayoutData(data);

			data = new FormData();
			// center vertically, to top of cards!
			data.top = new FormAttachment(cards, 5, SWT.CENTER);
			data.left = new FormAttachment(cbAbstract, 5);
			lCardinalities.setLayoutData(data);

			data = new FormData();
			data.left = new FormAttachment(0, 0);
			data.right = new FormAttachment(50, 2);
			tfMin.setLayoutData(data);

			data = new FormData();
			data.left = new FormAttachment(tfMin, 3);
			data.right = new FormAttachment(100, 0);
			tfMax.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(tfObjectName, 5);
			data.left = new FormAttachment(lCardinalities, 5);
			data.right = new FormAttachment(100, 0);
			cards.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(cbAbstract, 5);
			data.left = new FormAttachment(0, 0);
			lAttributeTypes.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(lAttributeTypes, 5);
			data.left = new FormAttachment(0, 0);
			data.right = new FormAttachment(100, 0);
			data.bottom = new FormAttachment(bAdd);
			data.height = 220;
			table.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(bAdd);
			data.left = new FormAttachment(0, 0);
			data.right = new FormAttachment(50, 0);
			bAccept.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(bDelete);
			data.left = new FormAttachment(bAccept);
			data.right = new FormAttachment(100, 0);
			bAbort.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(table);
			data.left = new FormAttachment(0, 0);
			data.right = new FormAttachment(50, 0);
			bAdd.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(table);
			data.left = new FormAttachment(bAdd);
			data.right = new FormAttachment(100, 0);
			bDelete.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(0, 5);
			data.bottom = new FormAttachment(100, -5);
			data.left = new FormAttachment(0, 5);
			data.right = new FormAttachment(100, -5);
			parent.setLayoutData(data);

			parent.layout(true, true);
			parent.setTabList(new Control[] { tfObjectName, cbAbstract, cards,
					table, bAdd, bDelete, bAccept, bAbort });
			cards.setTabList(new Control[] { tfMin, tfMax });
		}
	}

}
 
Stell mal ne konkrete Verständnisfrage. Hab keine Lust, mich durch den Code zu wühlen. :roll:

Nach kurzem Durschauen ist mir nur aufgefallen, dass Du die LayoutData von Deinem Table keinen top Wert zugewiesen bekommt. Da solltest Du z.B. folgendes einfügen:

Code:
data.top = new FormAttachment(lCardinalities, 0);

Dann ist der Table schonmal unterhalb vom Cardinalities Label (oder wo auch immer er hinsoll).
 
THX, das hat schonmal geholfen! (wobei ich das lAttributeTypes, dafür genommen habe)

jetzt sieht es so aus, als wäre das lCardinalities label auf derselben höhe, wie das lAttributeType-label.

aber es ist doch:
Code:
bottom(cbAbstract)= lAttributeType
right(cbAbstract)= lCardinalities

ich erwarte, das daraus folgt, das das lCardinalities-Label somit überhalb des lAttribute-labels sein muss.

Sprich: ich weiß nicht genau, was ich womit attachen muss. reicht es aus eine verknküpfungsseite zu haben?
oder muss/sollte man besser beide richtungen angeben.
also
Code:
bottom(XYZ)=ABC
und
top(ABC)=XYZ
was genau bedeutet es, wenn ich
Code:
data.top = new FormAttachment(0, 0);
schreibe? ich glaube, das es die componente an den oberen rand setzt.
ebenso wie wenn ich die komponente mit dem rechten rand verbinden will:
Code:
data.right = new FormAttachment(100, 0);

irgendwie hilft der jeweils eine satz in der API zu den sachen nicht viel weiter..

hoffentlich sind die fragen konkret genug 🙂

bis dann
 
Solour hat gesagt.:
was genau bedeutet es, wenn ich
Code:
data.top = new FormAttachment(0, 0);
schreibe? ich glaube, das es die componente an den oberen rand setzt.
ebenso wie wenn ich die komponente mit dem rechten rand verbinden will:
Code:
data.right = new FormAttachment(100, 0);

irgendwie hilft der jeweils eine satz in der API zu den sachen nicht viel weiter..

hoffentlich sind die fragen konkret genug 🙂

bis dann

Ersteres bedeutet, dass das Widget 0% vom oberen Rand platziert wird, also ganz oben. Zweiteres bedeutet, ganz rechts. Der erste Parameter ist immer der relative Prozentwert. 0 ist oben bzw. links. 100 ist unten bzw. rechts.

Eigentlich ist das platzieren der Widgets damit recht einfach, wenn man einmal verstanden hat, wie es läuft. Du fängst einfach oben links an mit dem ersten Widget. Danach attached Du z.B. die Widgets links daneben. Danach die nächsten Widgets darunter usw. Du musst dabei nicht immer alle left, right, top, bottom Werte setzen. Es reicht, wenn das Ergebnis eindeutig ist.

Wie gesagt: Das wichtigste ist, dass Du Dir vorher überlegst, wie Du die einzelnen Widgets platzieren willst und dann systematisch vorgehst. Ansonsten kommt man leicht durcheinander. Und vor allem: Mach einen Schritt nach dem anderen. Guck immer erst, ob das Widget richtig platziert ist und nimm dann das nächste dazu. Sonst wird das debuggen ziemlich kompliziert, weil man gar nicht mehr durchblickt.
 
hmm noch ne Frage:
ich hab das hier:
Code:
			data = new FormData();
			data.top = new FormAttachment(table);
			data.left = new FormAttachment(0, 0);
			data.right = new FormAttachment(50, 0);
			bAdd.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(table);
			data.left = new FormAttachment(bAdd);
			data.right = new FormAttachment(100, 0);
			bDelete.setLayoutData(data);
und es klappt, die buttons sind beide gleichbreit.
wenn ich aber nun
Code:
			data = new FormData();
			data.top = new FormAttachment(table);
			data.left = new FormAttachment(0, 0);
			data.right = new FormAttachment(bDelete); <<<<<<<<<<<<<
			bAdd.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(table);
			data.left = new FormAttachment(bAdd);
			data.right = new FormAttachment(100, 0);
			bDelete.setLayoutData(data);
schreibe, dann wird bAdd nur ganz klein und bDelete bekommt den gesamten Platz.
Gibt es (außer soetwas absolut anzugeben) eine möglichkeit zu sagen, dass beide componenten gleichbreit sein sollen?
bzw. das ein Label die minimal nötige größe hat und ein ein Text(feld) daneben sich automatisch ausbreitet?

Genau so einen Fall habe ich ja z.B. gleich ganz oben
Code:
			FormData data = new FormData();
			data.top = new FormAttachment(0, 0);
			data.left = new FormAttachment(0, 0);
			data.bottom = new FormAttachment(cbAbstract);
			data.right = new FormAttachment(tfObjectName);
			lName.setLayoutData(data);

			data = new FormData();
			data.top = new FormAttachment(0, 0);
			data.right = new FormAttachment(100, 0);
			tfObjectName.setLayoutData(data);

ansonsten gehe ich da ja schon systematisch vor, nur es kommt nicht das dabei raus, was ich erwarte :/
 
Wenn Du möchtest, dass ein Widget die minimale Breite bekommt, dann darfst Du nicht left und right angeben, sondern nur einen von beiden.
 
mhhh naja 🙂

nach noch etwas hinzufügen und entfernen stelle ich fest, das es einen unterschied macht, ob man top vom unteren widget angibt oder bottom vom oberen... (zumindest scheint es mir so)

aber es geht jetzt schonmal etwas....

THX!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben