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 });
		}
	}

}
 

byte

Top Contributor
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).
 

Solour

Aktives Mitglied
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
 

byte

Top Contributor
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.
 

Solour

Aktives Mitglied
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 :/
 

byte

Top Contributor
Wenn Du möchtest, dass ein Widget die minimale Breite bekommt, dann darfst Du nicht left und right angeben, sondern nur einen von beiden.
 

Solour

Aktives Mitglied
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X wiedermal Drag n Drop AWT, Swing, JavaFX & SWT 2
S Wiedermal eine Frage zum JTextField. AWT, Swing, JavaFX & SWT 5
D wiedermal JTable und die Spaltenbreite. AWT, Swing, JavaFX & SWT 8
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
S Layout - Problem AWT, Swing, JavaFX & SWT 1
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
R Layered Layout AWT, Swing, JavaFX & SWT 1
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
I JavaFX - festes Layout AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
kilopack15 Interface mit Layout verknüpfen AWT, Swing, JavaFX & SWT 2
Y Layout/Ausrichtungsprobleme AWT, Swing, JavaFX & SWT 4
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
A GUI Layout AWT, Swing, JavaFX & SWT 11
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
L wie Layout-Grid in JXPanel anzeigen? AWT, Swing, JavaFX & SWT 5
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout reagiert nicht auf Constraints AWT, Swing, JavaFX & SWT 4
IsSchoGuat LayoutManager Layout-Containergrösse AWT, Swing, JavaFX & SWT 4
F GridBag Layout AWT, Swing, JavaFX & SWT 1
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
J ComboBoxModel addElement verändert Layout AWT, Swing, JavaFX & SWT 8
E Probelm mit Layout AWT, Swing, JavaFX & SWT 1
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
P Tipps für GUI-Layout AWT, Swing, JavaFX & SWT 2
M Passender Layout-Manager AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout zur Laufzeit ändern AWT, Swing, JavaFX & SWT 8
N Swing Zweifarbiges Layout für den Filechooser AWT, Swing, JavaFX & SWT 12
B LayoutManager Card Layout AWT, Swing, JavaFX & SWT 2
E Angehängtes Layout, aber wie? AWT, Swing, JavaFX & SWT 12
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
B SWT layout invalidieren in SWT? AWT, Swing, JavaFX & SWT 4
R Welchen Layout Manager/ Wie strukturieren? AWT, Swing, JavaFX & SWT 14
J Layout: oben 20% unten 80% AWT, Swing, JavaFX & SWT 12
T Layout für Listendarstellung AWT, Swing, JavaFX & SWT 3
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
C LayoutManager Passendes Layout gesucht AWT, Swing, JavaFX & SWT 2
M Layout funktioniert nicht AWT, Swing, JavaFX & SWT 3
dzim Layout von Panes in JFX2 AWT, Swing, JavaFX & SWT 17
H Layout Idee AWT, Swing, JavaFX & SWT 8
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
P Swing welchen Layout Manager verwenden AWT, Swing, JavaFX & SWT 9
J LayoutManager Komponentenaustausch zerschießt Layout AWT, Swing, JavaFX & SWT 4
F Layout-Problem AWT, Swing, JavaFX & SWT 2
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
B Anderen Layout-Manager verwenden AWT, Swing, JavaFX & SWT 17
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
D Bild in JPanel verschiebt Layout. Wie fixieren? AWT, Swing, JavaFX & SWT 9
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
ARadauer Wenig Material zum Thema: Design, Layout, Usability von Swing Anwendungen AWT, Swing, JavaFX & SWT 11
S LayoutManager Welcher LayoutManager für dieses zweispaltige Layout? AWT, Swing, JavaFX & SWT 13
G LayoutManager Layout welches von Links nach rechts anordnet mit TOP Alignment! AWT, Swing, JavaFX & SWT 5
A Best practice für konkretes Layout AWT, Swing, JavaFX & SWT 10
G LayoutManager Layout für Spalten AWT, Swing, JavaFX & SWT 8
A Layout/JPanelgröße AWT, Swing, JavaFX & SWT 6
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
C SWT Tabellen-Layout in StyledText? AWT, Swing, JavaFX & SWT 6
J LayoutManager Welchen Layout/Design-Manager? AWT, Swing, JavaFX & SWT 4
R Swing Layout setzen AWT, Swing, JavaFX & SWT 3
L Layout automatische Anpassung umgehen? AWT, Swing, JavaFX & SWT 5
A Problem mit Layout-Manager AWT, Swing, JavaFX & SWT 11
J Button Layout anpassen AWT, Swing, JavaFX & SWT 22
H LayoutManager Layout mit GridBagLayout machbar? AWT, Swing, JavaFX & SWT 6
B Buttongröße im Layout AWT, Swing, JavaFX & SWT 4
B LayoutManager Layout Problem AWT, Swing, JavaFX & SWT 14
O LayoutManager Layout entwerfen AWT, Swing, JavaFX & SWT 3
A diverse Layout-Fragen AWT, Swing, JavaFX & SWT 4
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
dzim SWT Layout mit Sections aus Eclipse Forms AWT, Swing, JavaFX & SWT 17
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
C LayoutManager Layout und vergrößern des Frames AWT, Swing, JavaFX & SWT 5
E Swing Runde Buttons / Position eines Obj. im Layout AWT, Swing, JavaFX & SWT 7
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
A Ungewollte Layout änderungen AWT, Swing, JavaFX & SWT 3
A Suche: Eclipse-GUI-Layout AWT, Swing, JavaFX & SWT 5
E JPanel mit Null Layout entfernt Buttons AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben