Welcher Layout Manager ?

Hey,

habe vor kurzem mit Java angefangen und ein wenig mit der Gui herumgespielt allerdings ohne Layouts zu benutzen. Jetzt suche ich nach einer Möglichkeit mit Layout Managern erst einmal mein Frame in verschiedene Bereich mit fester anteiliger Größe aufzuteilen(10%,80%,10%).

Dann ein weiteres Problem, na eher eine frage, wenn ich als Hintergrund auf meinen Frame ein Bild habe bleiben beim resize Labels in Relation zum Bild an der Gleichen stelle?

Und zuletzt, ich habe Bilder die ich auf meinen Label anzeigen will ~ 200x100 kann ich trotz Layout Manager meine Label größe Manuel auf 200x100 setzen und was passiert mit meinen Bild beim resize?

danke für eure Hilfe

Ist zwar etwas schwierig ohne schon mit den Standard Layout Managern gearbeitet zu haben aber ich benutze sehr gerne das Standard Border Layout + JGoodies Forms Layout da sehr flexibel!

Um eine genaue Antwort zu geben, ist es interessant, wie die GUI eigentlich aussehen soll.
Ein BorderLayout lässt sich bspw. auch fest einstellen. Zumindest teilweise.
Ansonsten ist es oft üblich, LayoutManager mit Hilfe von Panels zu schachteln, oder anders herum Panels mittels LayoutManager geschickt zu verschachteln.

Du findest im Wiki verschiedene Beschreibungen mit Beispielen von verschiedenen LayoutManagern: LayoutManager der Standard-Java-API – Byte-Welt Wiki

Eine Alternative wäre TableLayout: http://www.oracle.com/technetwork/java/tablelayout-141489.html

Mit den Standard-Layouts von Swing geht das meines Wissens nicht, jedenfalls nicht ohne Tricks.

Aber mit dem genannten JGoodies Forms LAyout ohne biegen und brechen sehr einfach.

Vlt. nicht unbedingt schön, aber es funktioniert:


import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.Border;


public class GridBagLayoutTest 
{


	public static void main(String[] args) 
	{
		JFrame f = new JFrame();
		f.setSize(new Dimension(500,200));
		Border border = BorderFactory.createEtchedBorder();
		Container cp = f.getContentPane();
		GridBagLayout gbl = new GridBagLayout();
		cp.setLayout(gbl);
		
		JLabel lbl1 = new JLabel("1");
		JLabel lbl2 = new JLabel("2");
		JLabel lbl3 = new JLabel("3");
		lbl1.setBorder(border);
		lbl2.setBorder(border);
		lbl3.setBorder(border);

		GridBagConstraints gbc = new GridBagConstraints();
		
		gbc.weightx = 10;
		gbc.fill = GridBagConstraints.BOTH;
		gbl.setConstraints(lbl1, gbc);
		cp.add(lbl1);
		
		gbc.weightx = 80;
		gbl.setConstraints(lbl2, gbc);
		cp.add(lbl2);
		
		gbc.weightx = 10;
		gbl.setConstraints(lbl3, gbc);
		cp.add(lbl3);

		f.setVisible(true);
	}

}


Weitere Informationen kannst Du hier finden:
http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html

Mein Favorit ist http://www.miglayout.com/ . Super einfach in der Bedienung, stabil und macht was er soll. Wenns mit Bordmitteln sein muss, dann GridBagLayout (und wehe einer sagt, dass das Ding kompliziert ist!). Bietet sich halt bei komplexeren Masken super an, weil man sich dieses Geschachtel mit tausend Panels sparen kann. Das GridBagLayout hat aber leider so paar optische Macken, daher verwende ich lieber das MigLayout. Ansonsten muss ich sagen, ist der LayoutManager immer eine Wahl des Anwendungsfalls. Es macht z.B. keinen Sinn einen komplexen LayoutManager wie GridBagLayout, MigLayout oder auch die anderen genannten hochzufahren, wenn man einfach nur stupide Buttons hintereinander weg einfügen will, z.B. für eine Buttonleiste. Dafür ist FlowLayout super. Will man eine Art Menüleiste oben, unten eine Statusleiste und links vielleicht noch ein Menü in Form eines Trees mit dem dazugehörigen Content in der Mitte, dann bietet sich das BorderLayout perfekt an. Und so weiter …

nixht kompliziert, aber komplex… miglayout nutzen wir hier auch oefters, ist wirklich nett

was ist an grid bag komplex? Oo

Hab ich auch noch nie verstanden … Der ist in meinen Augen total simpel. Man muss sich natürlich im Vorfeld überlegen, wie man die Komponenten anordnen will, sprich eine Skizze wär schon nicht schlecht. Dann ergibt sich meist schon von allein ein mögliches Raster und das programmiert man nur noch runter. Das ist aber bei den anderen LayoutManagern auch nicht anders, erst denken, dann machen. Die Handhabung vom GBL ist simpel, da is nix dabei. Dennoch ist MigLayout meine Empfehlung :wink:

ich denke du verwechselst Komplexitaet mit Komplizierheit. Es ist nicht kompliziert, es ist recht strightforward. Es ist aber komplex, da man jeglich-moegliche Constante selbst setzen kann. Das BorderLayout zb ist nicht komplex, FlowLayout erst recht nicht. MigLayout ist wieder komplex, aber auch nicht kompliziert.

oh man jetzt hab ich soviele Vorschläge das ich kaum weiß wo ich anfangen soll^^ denke ich schau mir für den Anfang mal JGoodies an. Danke euch soweit vlt melde ich mich gleich noch mal wenn ich so nicht weiter komme.

jetzt doch noch mal eine Frage bevor ich mich durch die tuts arbeite. JGoodies oder MigLayout sind ja extra Layouts die man installieren muss. Wenn ich jetzt aus meinen Code ein Programm machen will und den verteile muss jeder Benutzer die Layouts installieren ? Gleiche frage, auch wenns hier nicht gerade passt, bei Datenbanken treibern sind die beim Endbenutzer automatisch mit drin?

ja du musst das jar dann mit deinem immer mitliefern

Nein ich verwechsle es nicht. Natürlich kann man jetzt alles Mögliche selbst bestimmen (in dem fall komplexer als FlowLayout), muss aber nicht. Wenn man eh nur, wie schon erwähnt, ein paar Buttons aneinanderreihen will, nimmt man eh FlowLayout. Zum GBLayout kommt man, wenn man etwas „komplexeres“ will, und entweder geht es dann mit GB oder man verschachtelt zig Panele mit zig LayoutManagern.
Meine Aussage bezieht sich darauf, dass viele Leute meinen, das GridBagLyout ist komplexer als Panele zu verschachteln, was nicht stimmt. Anfangs ist es auch einfacher „NullLayout“ zu nehmen, bis man sich mit LayoutManagern beschäftigt, dann ist das einfacher… beschäftigt man sich ausreichend mit GridBag, dann ist es deutlich einfacher (weniger komplex) als Panele+LayoutManager zu verschachteln.

Wie auch immer, GridBag ist komplexer als z.B. FlowLayout, aber nicht kompliziert :slight_smile:

so gerade erste gehversuche mit dem MigLayout gemacht und direkt hängts an der ersten stelle :frowning:

MainFrame.setLayout(mig);
MainFrame.add(panelLinks, "pushx, growx"); 

Exception in thread „main“ java.lang.IllegalArgumentException: Illegal Constraint: ‚pushx‘
Unknown keyword.

an der Stelle hier hänge ich am pushx was aber in der Doku drin steht und im tut auch genau so verwendet wird… kann mir hier eben wer weiter helfen ?

Was soll das pushx da überhaupt bewirken? Das brauchst du überhaupt nicht …

soweit ich das verstanden habe

growx lässt mein Element beim vergrößern des frames in x Richtung wachsen aber maximal bis zum Rand meiner Zelle
pushx soll dafür sorgen das mein Element weiter wachsen kann wenn noch Zellen in X Richtung frei sind.

Was ich will ist erst einmal die Aufteilung meines Frames in 3 Panels a w 10%:80%:10%, h 100%! und dann sollen die Panels beim vergrößern und verkleinern , ohne stopp, mit wachsen und schrumpfen.

Für das 3-Spalten-Layout sieht das so aus:

frame.setLayout(new MigLayout("ins 0", "[fill][fill][fill]", "[fill]"));
frame.add(panel0, "pushx 1");
frame.add(panel1, "pushx 8");
frame.add(panel2, "pushx 1");

// oder besser
frame.setLayout(new MigLayout("ins 0", "[grow 1][grow 8][grow 1]", "[fill]"));
frame.add(panel0);
frame.add(panel1);
frame.add(panel2);

hm tuts beides nicht

mig = new MigLayout("ins 0", "[fill][fill][fill]", "[fill]");
MainFrame = new JFrame();
panelLinks=new JPanel();
panelMitte=new JPanel();
panelRechts=new JPanel();
panelLinks.setBackground(Color.YELLOW);
panelMitte.setBackground(Color.RED);
panelRechts.setBackground(Color.BLUE);
MainFrame.setLayout(mig);
MainFrame.add(panelLinks, "growx 1");
MainFrame.add(panelMitte, "growx 8");
MainFrame.add(panelRechts, "growx 1");

ergibt nur 3 kleine Rechtecke auf meinem Frame und beim größer ziehen ändert sich auch nichts an der Größe…

€ bei pushx gabs wieder den fehler “push gibts nicht”

€€

"ins 0", "[grow 1][grow 8][grow 1]", "[fill]"
MainFrame.add(panelLinks);
MainFrame.add(panelMitte);
MainFrame.add(panelRechts);

hier bei werden die “kleinen Rechtecke” wenigstens in die Richtige Position gebracht aber wachsen nicht mit