GridBagLayout für komplexe GUI

Steve222

Mitglied
Hallo,

Wie wird in der Regel eine komplexe GUI aufgebaut?

Nimmt man dazu GridBagLayout, dessen Verwendung ich nicht gerade trivial finde.:confused:

Oder verteilt man die Steuerelemente
zu verschiedenen Panels und Containern und
verschachtelt diese dann mit eventuell verschiedenen
Layout- Klassen (FlowLayout, GridLayout, BorderLayout...).
Muss also alles mühselig ausgetüfftelt werden!?

Vor vielen Jahren habe ich mal mit VB5 GUIs erstellt. Das war
VIEL einfacher.:D
Gibt es in Java auch so eine bequeme Lösung?

Und noch ein Problem.

setSize( 80, 120) und setBounds(...) scheint nicht zu klappen.
Was muss ich nehmen, wenn ich die Größe und Position einzelner Swing-Steuerelemente
verändern will.
Ich habe den Eindruck, dass setSize( 80, 120) und setBounds(...) garnicht geht, wenn die Steuerelemente z.B. mit einem GridLayout angeordnet sind.

Vielen Dank für hilfreiche Hinweise

Steve222
 
Damit die Methoden setSize(), setLocation() und setBounds() greifen, müsstest du das s.g. NullLayout verwenden. Ist keine große Sache, einfach null an setLayout() übergeben.
Java:
setLayout(null);
Nun kannst du die Komponenten positionieren wie du willst und ihnen ihre Größen zuweisen.

Zu den LayoutManagern:
Wie du deine Komponenten anordnest, ist allein deine Sache. Wenn du keine LayoutManager verwenden willst, dann is das eben so. Wenn du statt GBL lieber auf verschachtelte und unüberschaubare Strukturen schwörst, dann ist das eben so. Du solltest dann aber die Verhaltensmuster der jeweiligen LayoutManager kennen, damit du sie richtig einsetzen kannst. Einige ziehen ihre Komponenten auseinander, andere geben ihnen feste Größen, einige verändern Position und Größe, wenn die Fenstergröße verändert wird, andere tun dies nicht. Je nachdem wie komplex die GUI wird, hat man schnell eine Struktur von Panels und LayoutManagern, die kein Mensch mehr überblickt. Um das alles zu entrümpeln kann man z.B. GridBagLayout (GBL) verwenden. Die Verwendung ist eigentlich super einfach und vor allem sehr dynamisch, man kann jeder Komponente eigene Verhaltensmuster zuweisen, z.B. feste Größe oder dass sie sich selbst anpasst, Andocken an Himmelsrichtungen, Nutzung des vorhandenen Platzes, Position und und und. Eine Alternative zum GBL ist das TableLayout, dieses ist aber eine externe Bibliothek. Die Verwendung ist für viele scheinbar leichter als die des GBL, aber naja, jedem das Seine ^^ Google einfach nach java TableLayout tutorial und gleich der erste Link, dann kannst du dir das ja mal anschauen.

EDIT:
Was genau findest du denn am GBL so nicht-trivial? Das sagen viele, auch in Büchern heißt es oft so, aber mir ist einfach nicht klar warum. Eigentlich ist die Verwendung super simpel, man muss sich nur im Vorfeld Gedanken über den Aufbau der GUI machen, z.B. durch Skizzen, aber das ist immer der Fall, weil niemand hat Lust auf ständiges Rumkorrigieren der GUI, also muss man sie eben erstmal skizzieren.
 
Zuletzt bearbeitet:
Hi Akeshihiro,

und Danke für die Antwort.

Du scheinst für die Nutzung von GridBagLayout zu plädieren. Vielleicht sollte ich mich
auf den Weg machen und mir das draufschaffen.
Ich habe ein bischen mit rumprobiert und kam auch ganz gut klar mit den Koordinaten, aber
manchmal dehnte oder verschob sich etwas seltsam. Kann man das mit GridBagConstraints abstellen?

Beim Arbeiten ohne GridBagLayout:
Leider hatte ich mit Deinem Hinweis setLayout(null); keinen Erfolg.
setSize(...) und setBounds(...) tun immer noch nichts.

Viele Grüße

Steve222
 
Hi Akeshihiro,

und Danke für die Antwort.

Du scheinst für die Nutzung von GridBagLayout zu plädieren. Vielleicht sollte ich mich
auf den Weg machen und mir das draufschaffen.
Ich habe ein bischen mit rumprobiert und kam auch ganz gut klar mit den Koordinaten, aber
manchmal dehnte oder verschob sich etwas seltsam. Kann man das mit GridBagConstraints abstellen?

Beim Arbeiten ohne GridBagLayout:
Leider hatte ich mit Deinem Hinweis setLayout(null); keinen Erfolg.
setSize(...) und setBounds(...) tun immer noch nichts.

Viele Grüße

Steve222
Beispiel für ein NullLayout:
Java:
package de.tutorials.steve222.layouts;

import javax.swing.JButton;
import javax.swing.JFrame;

public class NullLayoutExample extends JFrame {
	private static final long	serialVersionUID	= -1995332610799739537L;

	public NullLayoutExample() {
		setTitle(getClass().getName());
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		setLayout(null);
		
		JButton bt = new JButton("hallo");
		bt.setBounds(50, 50, 150, 25);
		add(bt);
		
		bt = new JButton("ok");
		bt.setBounds(200, 100, 200, 90);
		add(bt);
		
		setSize(500, 500);
		setLocationRelativeTo(null);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new NullLayoutExample();
	}
}
Funktioniert einwandfrei.

Also ich plädire zu gar nix und ich zwinge auch niemanden GBL zu verwenden, mache ich ja auch nicht immer. Man muss einfach abwägen, ob es Sinn macht. Wenn die GUI eher klein ist und kaum Komponenten hat, dann würde es fast schon Sinn machen sich lieber mit den anderen LayoutManagern zu befassen und 1, 2 oder 3 Panels mehr einzufügen (kommt natürlich drauf an, wie das ganze aufgebaut ist). Bei eher komplexeren würde dies aber die Übersicht negativ beieinflussen und wenn mal was geändert werden muss, z.B. neue Komponenten kommen hinzu, dann müsste man eventuell nochmal alles aufreißen. Beim GBL würden einige Komponenten eventuell neue Koordinaten bekommen, aber mehr passiert dann auch nicht.

Ich habe ein bischen mit rumprobiert und kam auch ganz gut klar mit den Koordinaten, aber
manchmal dehnte oder verschob sich etwas seltsam. Kann man das mit GridBagConstraints abstellen?
Ja, kann man. Mit der Eigenschaft fill kann man bestimmen, wie sich die Komponenten ausdehnen sollen, also horizontal, vertical, beides oder nix davon. Mit weightx und weighty kannst du dann noch bestimmen, was mit dem freien Platz passieren soll, der beim vergrößern des Fensters entsteht. Das ist allerdings eine relative angabe, also quasi prozentual. Wenn z.B. eine Komponenten bei weightx 0.5 zugewiesen bekommt und eine andere 3.0, dann wäre es so, dass die zweite Komponente ja mehr Platz in Anspruch nehmen wird. Die erste Komponenten bekommt also nur 16.66% und die zweite eben den Rest (ich hoffe ich hab mich nicht verrechnet xD). Wie groß die Zahlen im Endeffekt sind, ist egal, es kommt nur auf den relativen Vergleich an.
 
Hi Akeshihiro,
und danke nochmals für die Tipps.
Du bist der Ansicht, dass das GridBagLayout beherrschbar ist, wenn man sich ausreichend damit beschäftigt.
Es geschehen dann keine unvorhergesehen "Dinge" mehr, wenn man bereit ist das GridBagLayout richtig kennenzulernen. Dieser Hinweis ist für mich hilfreich und ich werde mich somit noch weiter mit dem GridBagLayout
beschäftigen um es möglichst auch zu beherrschen

Auch der Code "NullLayoutExample" von Dir hat mir gezeigt, dass man auch sehr gut eine GUI ganz ohne
LayoutManager gestalten kann. Auch das ist ein nüzlicher Hinweis. Danke!

Noch was anderes:
In der API heisst es zwar bei GridLayout: "...All components in the layout are given equal size."

Ich hatte mir aber bislang vorgestellt, dass auch bei (während) der Verwendung von
"setLayout(new GridLayout(3,2));" mit setSize(...) und setBounds(...) zumindest Größe und evtl auch Position der Steuerelemente trotzdem geändert werden kann.

Das geht wohl offenkundig (nach eigenen Tests) nicht, oder doch?

Viele Grüße
Steve222
 
Beim GridLayout werden die Komponenten auf die gesamte Größe der Gitter-Felder auseinander gezogen. Soweit ich weiß, kann man keine feste Größe verwenden. Ein Workaround wäre, dass man sich nen temporäres Panel erzeugt, dort das NullLayout verwendet und die Komponente mit entsprechender Größe positioniert. Die Frage ist natürlich, in wie weit das Ganze sinnvoll nutzbar ist, denn für jedes Feld ein Panel-Objekt erzeugen ist ja auch nicht die Lösung, jedenfalls nicht, wenn nur eine Komponente rein soll.
 
Hallo,

warum schaust du dir denn nicht mal das FormLayout an, wie ich oben schon mal vorgeschlagen hab? Es ist wesentlich leichter zu nutzen, als das GridbagLayout.

Gruß

Sascha
 

Neue Beiträge

Zurück