<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.byte-welt.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BERt0r</id>
	<title>Byte-Welt Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.byte-welt.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BERt0r"/>
	<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php/Spezial:Beitr%C3%A4ge/BERt0r"/>
	<updated>2026-07-28T04:50:14Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=DragLayout&amp;diff=6379</id>
		<title>DragLayout</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=DragLayout&amp;diff=6379"/>
		<updated>2014-04-28T18:46:59Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Null Layout is evil. Sieht man sich aber in der Situation, an dem man Komponenten hat, die sich wirklich kreuz und quer bewegen sollen kann man schon versucht sein, den Layoutmanager eben mal auf null zu setzen.&lt;br /&gt;
&lt;br /&gt;
Das dumme daran ist aber, die Größe des &amp;quot;genullten&amp;quot; Containers muss jetzt entweder auf einen fixen Wert gesetzt oder laufend neu berechnet werden. Aus dem Grund habe ich das DragLayout geschrieben.&lt;br /&gt;
&lt;br /&gt;
Das DragLayout zielt darauf ab, verschiebbare Komponenten in einem {{JAPI|JScrollpane}} zu haben. Schiebt man eine Komponente über den Rand, vergrößert sich automatisch der Container und die Scrollbalken erscheinen.&lt;br /&gt;
&lt;br /&gt;
Dabei spielt sich alles in 3 Methoden ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //geht alle Komponenten durch und findet die Extreme in allen Richtungen heraus, berechnet daraus dann die erforderliche Größe&lt;br /&gt;
    @Override&lt;br /&gt;
    public Dimension preferredLayoutSize(Container parent)&lt;br /&gt;
    {&lt;br /&gt;
        int top = 0,bot = 0,left = 0,right = 0;&lt;br /&gt;
        for(Component c:parent.getComponents())&lt;br /&gt;
        {&lt;br /&gt;
            Rectangle r=c.getBounds();&lt;br /&gt;
            if(r.x&amp;lt;left)&lt;br /&gt;
            {&lt;br /&gt;
                left=r.x;&lt;br /&gt;
            }&lt;br /&gt;
            else if(r.x+r.width&amp;gt;right)&lt;br /&gt;
            {&lt;br /&gt;
                right=r.x+r.width;&lt;br /&gt;
            }&lt;br /&gt;
            if(r.y&amp;lt;top)&lt;br /&gt;
            {&lt;br /&gt;
                top=r.y;&lt;br /&gt;
            }&lt;br /&gt;
            else if(r.y+r.height&amp;gt;bot)&lt;br /&gt;
            {&lt;br /&gt;
                bot=r.y+r.height;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
       &lt;br /&gt;
        return new Dimension(right+(left*-1),bot+(top*-1));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //Falls Komponenten über den Rand nach oben/links geschoben werden, werden deren Koordinaten negativ.&lt;br /&gt;
    //Nachdem der Container dann erweitert wurde und diese Komponenten voll zu erfassen ist es notwendig alle Komponenten nach unten rechts zu verschieben&lt;br /&gt;
    @Override&lt;br /&gt;
    public void layoutContainer(Container parent)&lt;br /&gt;
    {&lt;br /&gt;
        for(Component c:parent.getComponents())&lt;br /&gt;
        {&lt;br /&gt;
            Point location=c.getLocation();&lt;br /&gt;
            if(location.x&amp;lt;0)&lt;br /&gt;
            {&lt;br /&gt;
                moveAllBy((location.x*-1),0,parent.getComponents());&lt;br /&gt;
            }&lt;br /&gt;
            if(location.y&amp;lt;0)&lt;br /&gt;
            {&lt;br /&gt;
                moveAllBy(0,(location.y*-1),parent.getComponents());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //Bewegt alle Komponenten&lt;br /&gt;
    private void moveAllBy(int dx,int dy,Component[] components)&lt;br /&gt;
    {&lt;br /&gt;
        for(Component c:components)&lt;br /&gt;
        {&lt;br /&gt;
            Point location=c.getLocation();&lt;br /&gt;
            location.translate(dx,dy);&lt;br /&gt;
            c.setLocation(location);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das DragLayout verhält sich genau wie das NullLayout, man muss alle Komponenten von Hand ihre Position und Größe zuweisen. Es hat allerdings den Vorteil, dass es automatisch die preferredSize des Containers ausrechnet und dadurch die Verwendung in Kombination mit Scrollpanes und anderen Layoutmanagern ermlöglicht.&lt;br /&gt;
&lt;br /&gt;
Download eines vollständigen Beispiels: [http://forum.byte-welt.net/attachment.php?attachmentid=1369&amp;amp;d=1398530518 DragLayout.jar]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:bERt0r|bERt0r]] (26.04.2014 23:57 Uhr)&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=DragLayout&amp;diff=6378</id>
		<title>DragLayout</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=DragLayout&amp;diff=6378"/>
		<updated>2014-04-28T18:43:35Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Null Layout is evil. Sieht man sich aber in der Situation, an dem man Komponenten hat, die sich wirklich kreuz und quer bewegen sollen kann man schon versucht sein, den Layoutmanager eben mal auf null zu setzen.&lt;br /&gt;
&lt;br /&gt;
Das dumme daran ist aber, die Größe des &amp;quot;genullten&amp;quot; Containers muss jetzt entweder auf einen fixen Wert gesetzt oder laufend neu berechnet werden. Aus dem Grund habe ich das DragLayout geschrieben.&lt;br /&gt;
&lt;br /&gt;
Das DragLayout zielt darauf ab, verschiebbare Komponenten in einem {{JAPI|JScrollpane}} zu haben. Schiebt man eine Komponente über den Rand, vergrößert sich automatisch der Container und die Scrollbalken erscheinen.&lt;br /&gt;
&lt;br /&gt;
Dabei spielt sich alles in 3 Methoden ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //geht alle Komponenten durch und findet die Extreme in allen Richtungen heraus, berechnet daraus dann die erforderliche Größe&lt;br /&gt;
    @Override&lt;br /&gt;
    public Dimension preferredLayoutSize(Container parent)&lt;br /&gt;
    {&lt;br /&gt;
        int top = 0,bot = 0,left = 0,right = 0;&lt;br /&gt;
        for(Component c:parent.getComponents())&lt;br /&gt;
        {&lt;br /&gt;
            Rectangle r=c.getBounds();&lt;br /&gt;
            if(r.x&amp;lt;left)&lt;br /&gt;
            {&lt;br /&gt;
                left=r.x;&lt;br /&gt;
            }&lt;br /&gt;
            else if(r.x+r.width&amp;gt;right)&lt;br /&gt;
            {&lt;br /&gt;
                right=r.x+r.width;&lt;br /&gt;
            }&lt;br /&gt;
            if(r.y&amp;lt;top)&lt;br /&gt;
            {&lt;br /&gt;
                top=r.y;&lt;br /&gt;
            }&lt;br /&gt;
            else if(r.y+r.height&amp;gt;bot)&lt;br /&gt;
            {&lt;br /&gt;
                bot=r.y+r.height;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
       &lt;br /&gt;
        return new Dimension(right+(left*-1),bot+(top*-1));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //Falls Komponenten über den Rand nach oben/links geschoben werden, werden deren Koordinaten negativ.&lt;br /&gt;
    //Nachdem der Container dann erweitert wurde und diese Komponenten voll zu erfassen ist es notwendig alle Komponenten nach unten rechts zu verschieben&lt;br /&gt;
    @Override&lt;br /&gt;
    public void layoutContainer(Container parent)&lt;br /&gt;
    {&lt;br /&gt;
        for(Component c:parent.getComponents())&lt;br /&gt;
        {&lt;br /&gt;
            Point location=c.getLocation();&lt;br /&gt;
            if(location.x&amp;lt;0)&lt;br /&gt;
            {&lt;br /&gt;
                moveAllBy((location.x*-1),0,parent.getComponents());&lt;br /&gt;
            }&lt;br /&gt;
            if(location.y&amp;lt;0)&lt;br /&gt;
            {&lt;br /&gt;
                moveAllBy(0,(location.y*-1),parent.getComponents());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //Bewegt alle Komponenten&lt;br /&gt;
    private void moveAllBy(int dx,int dy,Component[] components)&lt;br /&gt;
    {&lt;br /&gt;
        for(Component c:components)&lt;br /&gt;
        {&lt;br /&gt;
            Point location=c.getLocation();&lt;br /&gt;
            location.translate(dx,dy);&lt;br /&gt;
            c.setLocation(location);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download eines vollständigen Beispiels: [http://forum.byte-welt.net/attachment.php?attachmentid=1369&amp;amp;d=1398530518 DragLayout.jar]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:bERt0r|bERt0r]] (26.04.2014 23:57 Uhr)&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=DragLayout&amp;diff=6377</id>
		<title>DragLayout</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=DragLayout&amp;diff=6377"/>
		<updated>2014-04-28T18:43:10Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Null Layout is evil. Sieht man sich aber in der Situation, an dem man Komponenten hat, die sich wirklich kreuz und quer bewegen sollen kann man schon versucht sein, den Layoutmanager eben mal auf null zu setzen.&lt;br /&gt;
Das dumme daran ist aber, die Größe des &amp;quot;genullten&amp;quot; Containers muss jetzt entweder auf einen fixen Wert gesetzt oder laufend neu berechnet werden. Aus dem Grund habe ich das DragLayout geschrieben.&lt;br /&gt;
Das DragLayout zielt darauf ab, verschiebbare Komponenten in einem {{JAPI|JScrollpane}} zu haben. Schiebt man eine Komponente über den Rand, vergrößert sich automatisch der Container und die Scrollbalken erscheinen.&lt;br /&gt;
&lt;br /&gt;
Dabei spielt sich alles in 3 Methoden ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //geht alle Komponenten durch und findet die Extreme in allen Richtungen heraus, berechnet daraus dann die erforderliche Größe&lt;br /&gt;
    @Override&lt;br /&gt;
    public Dimension preferredLayoutSize(Container parent)&lt;br /&gt;
    {&lt;br /&gt;
        int top = 0,bot = 0,left = 0,right = 0;&lt;br /&gt;
        for(Component c:parent.getComponents())&lt;br /&gt;
        {&lt;br /&gt;
            Rectangle r=c.getBounds();&lt;br /&gt;
            if(r.x&amp;lt;left)&lt;br /&gt;
            {&lt;br /&gt;
                left=r.x;&lt;br /&gt;
            }&lt;br /&gt;
            else if(r.x+r.width&amp;gt;right)&lt;br /&gt;
            {&lt;br /&gt;
                right=r.x+r.width;&lt;br /&gt;
            }&lt;br /&gt;
            if(r.y&amp;lt;top)&lt;br /&gt;
            {&lt;br /&gt;
                top=r.y;&lt;br /&gt;
            }&lt;br /&gt;
            else if(r.y+r.height&amp;gt;bot)&lt;br /&gt;
            {&lt;br /&gt;
                bot=r.y+r.height;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
       &lt;br /&gt;
        return new Dimension(right+(left*-1),bot+(top*-1));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //Falls Komponenten über den Rand nach oben/links geschoben werden, werden deren Koordinaten negativ.&lt;br /&gt;
    //Nachdem der Container dann erweitert wurde und diese Komponenten voll zu erfassen ist es notwendig alle Komponenten nach unten rechts zu verschieben&lt;br /&gt;
    @Override&lt;br /&gt;
    public void layoutContainer(Container parent)&lt;br /&gt;
    {&lt;br /&gt;
        for(Component c:parent.getComponents())&lt;br /&gt;
        {&lt;br /&gt;
            Point location=c.getLocation();&lt;br /&gt;
            if(location.x&amp;lt;0)&lt;br /&gt;
            {&lt;br /&gt;
                moveAllBy((location.x*-1),0,parent.getComponents());&lt;br /&gt;
            }&lt;br /&gt;
            if(location.y&amp;lt;0)&lt;br /&gt;
            {&lt;br /&gt;
                moveAllBy(0,(location.y*-1),parent.getComponents());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //Bewegt alle Komponenten&lt;br /&gt;
    private void moveAllBy(int dx,int dy,Component[] components)&lt;br /&gt;
    {&lt;br /&gt;
        for(Component c:components)&lt;br /&gt;
        {&lt;br /&gt;
            Point location=c.getLocation();&lt;br /&gt;
            location.translate(dx,dy);&lt;br /&gt;
            c.setLocation(location);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download eines vollständigen Beispiels: [http://forum.byte-welt.net/attachment.php?attachmentid=1369&amp;amp;d=1398530518 DragLayout.jar]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:bERt0r|bERt0r]] (26.04.2014 23:57 Uhr)&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=DragLayout&amp;diff=6376</id>
		<title>DragLayout</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=DragLayout&amp;diff=6376"/>
		<updated>2014-04-28T18:42:39Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Null Layout is evil. Sieht man sich aber in der Situation, an dem man Komponenten hat, die sich wirklich kreuz und quer bewegen sollen kann man schon versucht sein, den Layoutmanager eben mal auf null zu setzen.&lt;br /&gt;
&lt;br /&gt;
Das dumme daran ist aber, die größe des &amp;quot;genullten&amp;quot; Containers muss jetzt entweder auf einen fixen Wert gesetzt oder laufend neu berechnet werden. Aus dem Grund habe ich das DragLayout geschrieben.&lt;br /&gt;
&lt;br /&gt;
Das DragLayout zielt darauf ab, verschiebbare Komponenten in einem {{JAPI|JScrollpane}} zu haben. Schiebt man eine Komponente über den Rand, vergrößert sich automatisch der Container und die Scrollbalken erscheinen.&lt;br /&gt;
&lt;br /&gt;
Dabei spielt sich alles in 3 Methoden ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //geht alle Komponenten durch und findet die Extreme in allen Richtungen heraus, berechnet daraus dann die erforderliche Größe&lt;br /&gt;
    @Override&lt;br /&gt;
    public Dimension preferredLayoutSize(Container parent)&lt;br /&gt;
    {&lt;br /&gt;
        int top = 0,bot = 0,left = 0,right = 0;&lt;br /&gt;
        for(Component c:parent.getComponents())&lt;br /&gt;
        {&lt;br /&gt;
            Rectangle r=c.getBounds();&lt;br /&gt;
            if(r.x&amp;lt;left)&lt;br /&gt;
            {&lt;br /&gt;
                left=r.x;&lt;br /&gt;
            }&lt;br /&gt;
            else if(r.x+r.width&amp;gt;right)&lt;br /&gt;
            {&lt;br /&gt;
                right=r.x+r.width;&lt;br /&gt;
            }&lt;br /&gt;
            if(r.y&amp;lt;top)&lt;br /&gt;
            {&lt;br /&gt;
                top=r.y;&lt;br /&gt;
            }&lt;br /&gt;
            else if(r.y+r.height&amp;gt;bot)&lt;br /&gt;
            {&lt;br /&gt;
                bot=r.y+r.height;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
       &lt;br /&gt;
        return new Dimension(right+(left*-1),bot+(top*-1));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //Falls Komponenten über den Rand nach oben/links geschoben werden, werden deren Koordinaten negativ.&lt;br /&gt;
    //Nachdem der Container dann erweitert wurde und diese Komponenten voll zu erfassen ist es notwendig alle Komponenten nach unten rechts zu verschieben&lt;br /&gt;
    @Override&lt;br /&gt;
    public void layoutContainer(Container parent)&lt;br /&gt;
    {&lt;br /&gt;
        for(Component c:parent.getComponents())&lt;br /&gt;
        {&lt;br /&gt;
            Point location=c.getLocation();&lt;br /&gt;
            if(location.x&amp;lt;0)&lt;br /&gt;
            {&lt;br /&gt;
                moveAllBy((location.x*-1),0,parent.getComponents());&lt;br /&gt;
            }&lt;br /&gt;
            if(location.y&amp;lt;0)&lt;br /&gt;
            {&lt;br /&gt;
                moveAllBy(0,(location.y*-1),parent.getComponents());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    //Bewegt alle Komponenten&lt;br /&gt;
    private void moveAllBy(int dx,int dy,Component[] components)&lt;br /&gt;
    {&lt;br /&gt;
        for(Component c:components)&lt;br /&gt;
        {&lt;br /&gt;
            Point location=c.getLocation();&lt;br /&gt;
            location.translate(dx,dy);&lt;br /&gt;
            c.setLocation(location);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download eines vollständigen Beispiels: [http://forum.byte-welt.net/attachment.php?attachmentid=1369&amp;amp;d=1398530518 DragLayout.jar]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:bERt0r|bERt0r]] (26.04.2014 23:57 Uhr)&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=6266</id>
		<title>GroupLayout für Homosapiens</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=6266"/>
		<updated>2014-04-25T14:35:48Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: /* Gaps und Größenangaben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GroupLayout für Homosapiens: =&lt;br /&gt;
&lt;br /&gt;
Das GroupLayout ist ein mächtiger LayoutManager, der leider oft als komplizierter missverstanden wird, als er eigentlich ist. Besonders GUI-Builder erzeugen meist sehr hässlichen Code mit dem Grouplayout, weshalb ich euch rate erst mal ein GroupLayout von Hand zu schreiben.&lt;br /&gt;
GroupLayout wurde mit dem Ziel geschaffen, von GUI Buildern verwendet zu werden, von Hand programmiert, liegt der Schreibaufwand etwa wie beim GridBagLayout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem JPanel ein GroupLayout zu verpassen funktioniert erstmal nicht ganz genauso wie bei anderen LayoutManagern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JPanel panel=new JPanel();&lt;br /&gt;
GroupLayout layout = new GroupLayout(panel);&lt;br /&gt;
panel.setLayout(layout);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das GroupLayout wirft sehr schnell mal Exceptions wenn bei der initialisierung etwas schief gelaufen ist (z.B ein Komponent vergessen). Davon nicht abschrecken lassen! Andere LayoutManager kaschieren manche Ungereimtheiten und zeigen trotzdem was an. Das GroupLayout ist da wohl eher auf Perfektionismus ausgelegt: richtig oder gar nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Zu den Komponenten: =&lt;br /&gt;
&lt;br /&gt;
Auch hier geht das GroupLayout wieder einen eigenen Weg: Komponenten werden nicht per panel.add(Component c) &amp;quot;hinzugefügt&amp;quot;.&lt;br /&gt;
Man fasst die Komponenten in Gruppen zusammen und setzt diese in Beziehungen zueinander.&lt;br /&gt;
Anders als bei den GridBagConstraints wurde beim GroupLayout dieses &amp;quot;Beziehungen setzen&amp;quot; aber zweigeteilt: Man gibt die Größenverhältnisse einmal vertikal und einmal horizontal an:&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir imitieren ein FlowLayout mit 3 Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JLabel label1=new JLabel(&amp;quot;1&amp;quot;);&lt;br /&gt;
JLabel label2=new JLabel(&amp;quot;2&amp;quot;);&lt;br /&gt;
JLabel label3=new JLabel(&amp;quot;3&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. Beziehungen auf vertikaler Ebene: ==&lt;br /&gt;
&lt;br /&gt;
Wir wollen, dass alle 3 Labels in der gleichen Zeile stehen. Sehen wir von &amp;quot;Norden&amp;quot; aus auf unser Layout drauf (man beuge sich über den Bildschirm und blicke nach unten), sind die 3 Labels nebeneinander. Wenn wir 2 oder mehr Komponenten nebeneinander ausrichten wollen, benötigen wir eine ParallelGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup verticalGroup=layout.createParallelGroup();&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser ParallelGroup werden jetzt die Komponenten hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. Beziehungen auf horizontaler Ebene: ==&lt;br /&gt;
&lt;br /&gt;
Sehen wir von &amp;quot;Westen&amp;quot; auf unser Layout (man stelle sich links neben den Bildschirm und blicke hinein), sind die 3 Labels hintereinander. Dafür gibts die SequentialGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup horizontalGroup=layout.createSequentialGroup;&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss müssen wir unsere erstellten Gruppen noch dem Layout mit folgenden Methoden zuweisen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setVerticalGroup(verticalGroup);&lt;br /&gt;
layout.setHorizontalGroup(horizontalGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt noch panel in einen JFrame packen und fertig, unser erstes GroupLayout läuft! &lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-1-FlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn du einen Komponenten nur zu einer Group addest, fliegt eine Exception und es wird nichts angezeigt!&lt;br /&gt;
&lt;br /&gt;
= VerticalFlowLayout =&lt;br /&gt;
&lt;br /&gt;
Aber was nützt uns ein FlowLayout? Schon so mancher hat den Bedarf nach einem VerticalFlowLayout angemeldet. Mit GroupLayout kein Problem: wir vertauschen einfach vertical- und horizontalGroup.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&lt;br /&gt;
&lt;br /&gt;
ParallelGroup horizontalGroup=layout.createParallelGroup;&lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-2-VerticalFlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
= Standard GUI =&lt;br /&gt;
&lt;br /&gt;
Wie sieht es nun mit komplexeren Masken aus? Ich habe früher versucht aus zig verschiedenen, verschachtelten Panels mit jeweils eigenem einfachen LayoutManagern eine GUI zusammenzubasteln. Der Aufwand war enorm, die Übersichtlichkeit schrecklich, es war fehleranfällig und meist kam sowieso nicht das raus was gewollt war.&lt;br /&gt;
Mit dem GroupLayout kann man sich das Panel verschachteln sparen, man verschachtelt die Groups. Das schafft zwar das Problem des Verschachtelns nicht aus der Welt, man kann sich aber besser auf die eine Sache konzentrieren weil man sich eine Menge Panels spart.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir erweitern unser VerticalFlowGroupLayout: Da soll in jede Zeile noch zusätzlich ein Textfeld und ein Button rein:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-3-SchoeneGui.png]]&lt;br /&gt;
&lt;br /&gt;
== 1. Vertikale Group: ==&lt;br /&gt;
&lt;br /&gt;
Wir stellen uns wieder vor, wir blicken von oben in unser Layout rein. Jetzt gibt’s zwei Betrachtungsweisen: Haben wir 3 Zeilen hintereinander, in denen je ein Label, ein Textfeld und ein Button nebeneinander stehen oder haben wir 3 Spalten nebeneinander mit jeweils 3 Labels, Textfeldern und Buttons hintereinander?&lt;br /&gt;
Die Entscheidung bleibt dir überlassen, ich werde es hier anhand des „3 Zeilen“ Ansatzes demonstrieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
        &lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. Horizontale Group ==&lt;br /&gt;
&lt;br /&gt;
Analog zur Vertikalen Group: Haben wir 3 Zeilen nebeneinander in denen Label, Textfeld und Button hintereinander stehen oder haben wir 3 Spalten hintereinander, in denen untereinander je 3 Labels, Textfelder oder Buttons stehen?&lt;br /&gt;
W man sich beim Vertikalen Teil für die Zeilen Denkweise entschieden hat, ist es mMn sinnvoll dabei zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup horizontalGroup=layout.createParallelGroup();&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In meinem StandardFrame mit fixer Größe sieht das ganze nun aber so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-4-HaesslicheGui.png]]&lt;br /&gt;
&lt;br /&gt;
Die Komponenten füllen den gesamten Platz der aus – wir brauchen soetwas wie den Glue aus dem BoxLayout. Im GroupLayout heißt das Gap was die Sache mMn auch besser beschreibt (wer will denn Kleber in seiner GUI?).&lt;br /&gt;
&lt;br /&gt;
= Gaps und Größenangaben =&lt;br /&gt;
&lt;br /&gt;
Erstens gibt’s da mal eine Komfortfunktion die ich eigentlich immer aktiviert habe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setAutoCreateGaps(true);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kleben die Komponenten nicht mehr so aneinander, wie man das auch vom GridLayout her kennt.&lt;br /&gt;
&lt;br /&gt;
Zu unserm Problem, wir können Gaps genauso wie Komponenten einer Gruppe hinzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(Short.MAX_VALUE);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
addGap erwartet einen Integer Wert als Parameter, der angibt wie groß der Gap sein soll. Short.MAX_VALUE liegt bei ca. 32000, so große Displays gibt’s noch nicht.&lt;br /&gt;
&lt;br /&gt;
Man kann addGap aber auch 3 ints übergeben: addGap(int min,int pref, int max)&lt;br /&gt;
Man kann also Minimum, Preferred und Maximum Size einstellen. Das funktioniert genauso bei Komponenten:&lt;br /&gt;
&lt;br /&gt;
Ändern wir den Code auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
. addComponent(textField1,20,20,20)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird unser Textfield1 immer genau 20 Pixel hoch sein.&lt;br /&gt;
Achtung: Die Größenangaben beziehen sich immer auf die Achse, in der sie gemacht werden. Angaben in der VerticalGroup beeinflussen nur die Höhe, Angaben in der HorizontalGroup nur die Breite.&lt;br /&gt;
&lt;br /&gt;
Die Größenangaben manuell anzugeben ist allerdings kein sauberer Stil. Komponenten haben ja selber schon min, preferred und max Size Einstellungen, die werden dadurch einfach ignoriert. Um dem GroupLayout zu sagen, es soll immer auf eine dieser Methoden zurückgreifen gibt’s 2 Konstanten:&lt;br /&gt;
GroupLayout.DEFAULT_SIZE und GroupLayout.PREFERRED_SIZE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                .addComponent(button1)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Textfeld maximal die Höhe seiner PreferredSize haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-5-TextfeldHoehe.png]]&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir wollen links unten in unserem Fenster einen OK Button einfügen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-6-Okbutton.png]]&lt;br /&gt;
&lt;br /&gt;
Wir fügen einen Gap zwischen Zeile 3 und dem Ok Button ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(0,0,Short.MAX_VALUE);&lt;br /&gt;
verticalGroup.addComponent(okButton);&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addGap(0,0,Short.MAX_VALUE)&lt;br /&gt;
                .addComponent(okButton));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ein (0,0,Short.MAX_VALUE) Gap füllt soviel Platz aus, wie ihm zur Verfügung steht. Egal wie groß ihr das Fenster macht, der OK Button ist immer rechts unten.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
= Fortgeschrittenes: =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir stellen die Font eines unserer Labels auf 80 und wollen, dass die Textfeld und Button in der Mitte der Zeile angezeigt werden. Wir setzten für unsere Textfelder unterschiedliche Preferred Sizes und wollen dass die Buttons alle schön untereinander stehen und gleich breit sein. Ausserdem soll das Layout nur so viel Platz wie nötig ausfüllen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-7-Fortgeschritten.png]]&lt;br /&gt;
&lt;br /&gt;
Erstmal setzten wir ganz normal die Preferred Size der Textfelder und die Font des Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;Font f = new Font( &amp;quot;Arial&amp;quot;, Font.PLAIN, 80 );&lt;br /&gt;
label1.setFont(f);&lt;br /&gt;
 &lt;br /&gt;
textField1.setPreferredSize(new Dimension(70,20));&lt;br /&gt;
textField2.setPreferredSize(new Dimension(100,20));&lt;br /&gt;
textField3.setPreferredSize(new Dimension(130,20));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 1:&#039;&#039;&#039; Die Komponenten einer Zeile der Höhe nach mittig ausrichten:&lt;br /&gt;
ParallelGroups kann man beim erzeugen einen Alignment Parameter übergeben. (Alignment. LEADING, TRAILING, CENTER oder BASELINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup(Alignment.CENTER)&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
.addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 2:&#039;&#039;&#039; Quasi ein Tabstopp für die Buttons. Wir haben nicht mehr einfach 4 Zeilen, wir haben 4 Zeilen und 2 Spalten. &lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-8-Rechtecke.png]]&lt;br /&gt;
&lt;br /&gt;
Die HorizontalGroup muss deshalb verändert werden:&lt;br /&gt;
Wir stellen uns vor, wir schauen von „Westen“/Links auf unser Layout.&lt;br /&gt;
Da wir in unserem Layout 2 Spalten haben (Rote Rechtecke), die klar abgegrenzt hintereinander kommen sollen Brauchen wir erstmal eine SequentialGroup.&lt;br /&gt;
SequentialGroup horizontalGroup=layout.createSequentialGroup();&lt;br /&gt;
&lt;br /&gt;
Jetzt betrachten wir erstmal nur das linke Rechteck (um das rechte kümmern wir uns nachher).&lt;br /&gt;
3 Zeilen übereinander mit je Label und Textfeld hintereinander oder 3 Labels übereinander, danach 3 Textfelder übereinander. (Wir machens auf die Zeilen Art).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup labelTextfieldGroup=layout.createParallelGroup()&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2)&lt;br /&gt;
                .addComponent(textField2,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3)&lt;br /&gt;
                .addComponent(textField3,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch die 4 Buttons übereinander, das ist wieder einfacher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup buttonGroup=layout.createParallelGroup(Alignment.TRAILING)&lt;br /&gt;
        .addComponent(button1)&lt;br /&gt;
        .addComponent(button2)&lt;br /&gt;
        .addComponent(button3)&lt;br /&gt;
        .addComponent(okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt stöpseln wir die zwei roten Rechteck-Gruppen zusammen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;horizontalGroup.addGroup(labelTextfieldGroup).addGroup(buttonGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 3:&#039;&#039;&#039; Den Buttons die gleiche Breite verpassen.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt’s die Funktion linkSize:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.linkSize(SwingConstants.HORIZONTAL,button1,button2,button3,okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwingConstants.HORIZONTAL gibt an ob man die Breite oder die Höhe verlinken will. Danach kann man beliebig viele Komponenten hinzuschreiben (varargs).&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Links: =&lt;br /&gt;
&lt;br /&gt;
API-Dokumentation vom [http://docs.oracle.com/javase/7/docs/api/javax/swing/GroupLayout.html GroupLayout] &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Oracle: [http://download.oracle.com/javase/tutorial/uiswing/layout/group.html How to Use GroupLayout (The Java™ Tutorials &amp;gt; Creating a GUI With JFC/Swing &amp;gt; Laying Out Components]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer: bERt0r|bERt0r]] 04:06, 16. Dez 2011 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=6265</id>
		<title>GroupLayout für Homosapiens</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=6265"/>
		<updated>2014-04-25T14:34:19Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: /* VerticalFlowLayout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GroupLayout für Homosapiens: =&lt;br /&gt;
&lt;br /&gt;
Das GroupLayout ist ein mächtiger LayoutManager, der leider oft als komplizierter missverstanden wird, als er eigentlich ist. Besonders GUI-Builder erzeugen meist sehr hässlichen Code mit dem Grouplayout, weshalb ich euch rate erst mal ein GroupLayout von Hand zu schreiben.&lt;br /&gt;
GroupLayout wurde mit dem Ziel geschaffen, von GUI Buildern verwendet zu werden, von Hand programmiert, liegt der Schreibaufwand etwa wie beim GridBagLayout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem JPanel ein GroupLayout zu verpassen funktioniert erstmal nicht ganz genauso wie bei anderen LayoutManagern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JPanel panel=new JPanel();&lt;br /&gt;
GroupLayout layout = new GroupLayout(panel);&lt;br /&gt;
panel.setLayout(layout);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das GroupLayout wirft sehr schnell mal Exceptions wenn bei der initialisierung etwas schief gelaufen ist (z.B ein Komponent vergessen). Davon nicht abschrecken lassen! Andere LayoutManager kaschieren manche Ungereimtheiten und zeigen trotzdem was an. Das GroupLayout ist da wohl eher auf Perfektionismus ausgelegt: richtig oder gar nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Zu den Komponenten: =&lt;br /&gt;
&lt;br /&gt;
Auch hier geht das GroupLayout wieder einen eigenen Weg: Komponenten werden nicht per panel.add(Component c) &amp;quot;hinzugefügt&amp;quot;.&lt;br /&gt;
Man fasst die Komponenten in Gruppen zusammen und setzt diese in Beziehungen zueinander.&lt;br /&gt;
Anders als bei den GridBagConstraints wurde beim GroupLayout dieses &amp;quot;Beziehungen setzen&amp;quot; aber zweigeteilt: Man gibt die Größenverhältnisse einmal vertikal und einmal horizontal an:&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir imitieren ein FlowLayout mit 3 Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JLabel label1=new JLabel(&amp;quot;1&amp;quot;);&lt;br /&gt;
JLabel label2=new JLabel(&amp;quot;2&amp;quot;);&lt;br /&gt;
JLabel label3=new JLabel(&amp;quot;3&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. Beziehungen auf vertikaler Ebene: ==&lt;br /&gt;
&lt;br /&gt;
Wir wollen, dass alle 3 Labels in der gleichen Zeile stehen. Sehen wir von &amp;quot;Norden&amp;quot; aus auf unser Layout drauf (man beuge sich über den Bildschirm und blicke nach unten), sind die 3 Labels nebeneinander. Wenn wir 2 oder mehr Komponenten nebeneinander ausrichten wollen, benötigen wir eine ParallelGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup verticalGroup=layout.createParallelGroup();&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser ParallelGroup werden jetzt die Komponenten hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. Beziehungen auf horizontaler Ebene: ==&lt;br /&gt;
&lt;br /&gt;
Sehen wir von &amp;quot;Westen&amp;quot; auf unser Layout (man stelle sich links neben den Bildschirm und blicke hinein), sind die 3 Labels hintereinander. Dafür gibts die SequentialGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup horizontalGroup=layout.createSequentialGroup;&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss müssen wir unsere erstellten Gruppen noch dem Layout mit folgenden Methoden zuweisen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setVerticalGroup(verticalGroup);&lt;br /&gt;
layout.setHorizontalGroup(horizontalGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt noch panel in einen JFrame packen und fertig, unser erstes GroupLayout läuft! &lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-1-FlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn du einen Komponenten nur zu einer Group addest, fliegt eine Exception und es wird nichts angezeigt!&lt;br /&gt;
&lt;br /&gt;
= VerticalFlowLayout =&lt;br /&gt;
&lt;br /&gt;
Aber was nützt uns ein FlowLayout? Schon so mancher hat den Bedarf nach einem VerticalFlowLayout angemeldet. Mit GroupLayout kein Problem: wir vertauschen einfach vertical- und horizontalGroup.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&lt;br /&gt;
&lt;br /&gt;
ParallelGroup horizontalGroup=layout.createParallelGroup;&lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-2-VerticalFlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
= Standard GUI =&lt;br /&gt;
&lt;br /&gt;
Wie sieht es nun mit komplexeren Masken aus? Ich habe früher versucht aus zig verschiedenen, verschachtelten Panels mit jeweils eigenem einfachen LayoutManagern eine GUI zusammenzubasteln. Der Aufwand war enorm, die Übersichtlichkeit schrecklich, es war fehleranfällig und meist kam sowieso nicht das raus was gewollt war.&lt;br /&gt;
Mit dem GroupLayout kann man sich das Panel verschachteln sparen, man verschachtelt die Groups. Das schafft zwar das Problem des Verschachtelns nicht aus der Welt, man kann sich aber besser auf die eine Sache konzentrieren weil man sich eine Menge Panels spart.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir erweitern unser VerticalFlowGroupLayout: Da soll in jede Zeile noch zusätzlich ein Textfeld und ein Button rein:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-3-SchoeneGui.png]]&lt;br /&gt;
&lt;br /&gt;
== 1. Vertikale Group: ==&lt;br /&gt;
&lt;br /&gt;
Wir stellen uns wieder vor, wir blicken von oben in unser Layout rein. Jetzt gibt’s zwei Betrachtungsweisen: Haben wir 3 Zeilen hintereinander, in denen je ein Label, ein Textfeld und ein Button nebeneinander stehen oder haben wir 3 Spalten nebeneinander mit jeweils 3 Labels, Textfeldern und Buttons hintereinander?&lt;br /&gt;
Die Entscheidung bleibt dir überlassen, ich werde es hier anhand des „3 Zeilen“ Ansatzes demonstrieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
        &lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. Horizontale Group ==&lt;br /&gt;
&lt;br /&gt;
Analog zur Vertikalen Group: Haben wir 3 Zeilen nebeneinander in denen Label, Textfeld und Button hintereinander stehen oder haben wir 3 Spalten hintereinander, in denen untereinander je 3 Labels, Textfelder oder Buttons stehen?&lt;br /&gt;
W man sich beim Vertikalen Teil für die Zeilen Denkweise entschieden hat, ist es mMn sinnvoll dabei zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup horizontalGroup=layout.createParallelGroup();&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In meinem StandardFrame mit fixer Größe sieht das ganze nun aber so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-4-HaesslicheGui.png]]&lt;br /&gt;
&lt;br /&gt;
Die Komponenten füllen den gesamten Platz der aus – wir brauchen soetwas wie den Glue aus dem BoxLayout. Im GroupLayout heißt das Gap was die Sache mMn auch besser beschreibt (wer will denn Kleber in seiner GUI?).&lt;br /&gt;
&lt;br /&gt;
= Gaps und Größenangaben =&lt;br /&gt;
&lt;br /&gt;
Erstens gibt’s da mal eine Komfortfunktion die man ich eigentlich immer aktiviert habe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setAutoCreateGaps(true);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kleben die Komponenten nicht mehr so aneinander, wie man das auch vom GridLayout her kennt.&lt;br /&gt;
&lt;br /&gt;
Zu unserm Problem, wir können Gaps genauso wie Komponenten einer Gruppe hinzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(Short.MAX_VALUE);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
addGap erwartet einen Integer Wert als Parameter, der angibt wie groß der Gap sein soll. Short.MAX_VALUE liegt bei ca. 32000, so große Displays gibt’s noch nicht.&lt;br /&gt;
&lt;br /&gt;
Man kann addGap aber auch 3 ints übergeben: addGap(int min,int pref, int max)&lt;br /&gt;
Man kann also Minimum, Preferred und Maximum Size einstellen. Das funktioniert genauso bei Komponenten:&lt;br /&gt;
&lt;br /&gt;
Ändern wir den Code auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
. addComponent(textField1,20,20,20)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird unser Textfield1 immer genau 20 Pixel hoch sein.&lt;br /&gt;
Achtung: Die Größenangaben beziehen sich immer auf die Achse, in der sie gemacht werden. Angaben in der VerticalGroup beeinflussen nur die Höhe, Angaben in der HorizontalGroup nur die Breite.&lt;br /&gt;
&lt;br /&gt;
Die Größenangaben manuell anzugeben ist allerdings kein sauberer Stil. Komponenten haben ja selber schon min, preferred und max Size Einstellungen, die werden dadurch einfach ignoriert. Um dem GroupLayout zu sagen, es soll immer auf eine dieser Methoden zurückgreifen gibt’s 2 Konstanten:&lt;br /&gt;
GroupLayout.DEFAULT_SIZE und GroupLayout.PREFERRED_SIZE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                .addComponent(button1)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Textfeld maximal die Höhe seiner PreferredSize haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-5-TextfeldHoehe.png]]&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir wollen links unten in unserem Fenster einen OK Button einfügen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-6-Okbutton.png]]&lt;br /&gt;
&lt;br /&gt;
Wir fügen einen Gap zwischen Zeile 3 und dem Ok Button ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(0,0,Short.MAX_VALUE);&lt;br /&gt;
verticalGroup.addComponent(okButton);&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addGap(0,0,Short.MAX_VALUE)&lt;br /&gt;
                .addComponent(okButton));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ein (0,0,Short.MAX_VALUE) Gap füllt soviel Platz aus, wie ihm zur Verfügung steht. Egal wie groß ihr das Fenster macht, der OK Button ist immer rechts unten.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
= Fortgeschrittenes: =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir stellen die Font eines unserer Labels auf 80 und wollen, dass die Textfeld und Button in der Mitte der Zeile angezeigt werden. Wir setzten für unsere Textfelder unterschiedliche Preferred Sizes und wollen dass die Buttons alle schön untereinander stehen und gleich breit sein. Ausserdem soll das Layout nur so viel Platz wie nötig ausfüllen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-7-Fortgeschritten.png]]&lt;br /&gt;
&lt;br /&gt;
Erstmal setzten wir ganz normal die Preferred Size der Textfelder und die Font des Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;Font f = new Font( &amp;quot;Arial&amp;quot;, Font.PLAIN, 80 );&lt;br /&gt;
label1.setFont(f);&lt;br /&gt;
 &lt;br /&gt;
textField1.setPreferredSize(new Dimension(70,20));&lt;br /&gt;
textField2.setPreferredSize(new Dimension(100,20));&lt;br /&gt;
textField3.setPreferredSize(new Dimension(130,20));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 1:&#039;&#039;&#039; Die Komponenten einer Zeile der Höhe nach mittig ausrichten:&lt;br /&gt;
ParallelGroups kann man beim erzeugen einen Alignment Parameter übergeben. (Alignment. LEADING, TRAILING, CENTER oder BASELINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup(Alignment.CENTER)&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
.addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 2:&#039;&#039;&#039; Quasi ein Tabstopp für die Buttons. Wir haben nicht mehr einfach 4 Zeilen, wir haben 4 Zeilen und 2 Spalten. &lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-8-Rechtecke.png]]&lt;br /&gt;
&lt;br /&gt;
Die HorizontalGroup muss deshalb verändert werden:&lt;br /&gt;
Wir stellen uns vor, wir schauen von „Westen“/Links auf unser Layout.&lt;br /&gt;
Da wir in unserem Layout 2 Spalten haben (Rote Rechtecke), die klar abgegrenzt hintereinander kommen sollen Brauchen wir erstmal eine SequentialGroup.&lt;br /&gt;
SequentialGroup horizontalGroup=layout.createSequentialGroup();&lt;br /&gt;
&lt;br /&gt;
Jetzt betrachten wir erstmal nur das linke Rechteck (um das rechte kümmern wir uns nachher).&lt;br /&gt;
3 Zeilen übereinander mit je Label und Textfeld hintereinander oder 3 Labels übereinander, danach 3 Textfelder übereinander. (Wir machens auf die Zeilen Art).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup labelTextfieldGroup=layout.createParallelGroup()&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2)&lt;br /&gt;
                .addComponent(textField2,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3)&lt;br /&gt;
                .addComponent(textField3,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch die 4 Buttons übereinander, das ist wieder einfacher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup buttonGroup=layout.createParallelGroup(Alignment.TRAILING)&lt;br /&gt;
        .addComponent(button1)&lt;br /&gt;
        .addComponent(button2)&lt;br /&gt;
        .addComponent(button3)&lt;br /&gt;
        .addComponent(okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt stöpseln wir die zwei roten Rechteck-Gruppen zusammen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;horizontalGroup.addGroup(labelTextfieldGroup).addGroup(buttonGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 3:&#039;&#039;&#039; Den Buttons die gleiche Breite verpassen.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt’s die Funktion linkSize:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.linkSize(SwingConstants.HORIZONTAL,button1,button2,button3,okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwingConstants.HORIZONTAL gibt an ob man die Breite oder die Höhe verlinken will. Danach kann man beliebig viele Komponenten hinzuschreiben (varargs).&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Links: =&lt;br /&gt;
&lt;br /&gt;
API-Dokumentation vom [http://docs.oracle.com/javase/7/docs/api/javax/swing/GroupLayout.html GroupLayout] &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Oracle: [http://download.oracle.com/javase/tutorial/uiswing/layout/group.html How to Use GroupLayout (The Java™ Tutorials &amp;gt; Creating a GUI With JFC/Swing &amp;gt; Laying Out Components]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer: bERt0r|bERt0r]] 04:06, 16. Dez 2011 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5679</id>
		<title>GroupLayout für Homosapiens</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5679"/>
		<updated>2013-09-09T13:48:24Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: /* Fortgeschrittenes: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GroupLayout für Homosapiens: ==&lt;br /&gt;
&lt;br /&gt;
Das GroupLayout ist ein mächtiger LayoutManager, der leider oft als komplizierter missverstanden wird, als er eigentlich ist. Besonders GUI-Builder erzeugen meist sehr hässlichen Code mit dem Grouplayout, weshalb ich euch rate erst mal ein GroupLayout von Hand zu schreiben.&lt;br /&gt;
GroupLayout wurde mit dem Ziel geschaffen, von GUI Buildern verwendet zu werden, von Hand programmiert, liegt der Schreibaufwand etwa wie beim GridBagLayout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem JPanel ein GroupLayout zu verpassen funktioniert erstmal nicht ganz genauso wie bei anderen LayoutManagern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JPanel panel=new JPanel();&lt;br /&gt;
GroupLayout layout = new GroupLayout(panel);&lt;br /&gt;
panel.setLayout(layout);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das GroupLayout wirft sehr schnell mal Exceptions wenn bei der initialisierung etwas schief gelaufen ist (z.B ein Komponent vergessen). Davon nicht abschrecken lassen! Andere LayoutManager kaschieren manche Ungereimtheiten und zeigen trotzdem was an. Das GroupLayout ist da wohl eher auf Perfektionismus ausgelegt: richtig oder gar nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zu den Komponenten: ==&lt;br /&gt;
&lt;br /&gt;
Auch hier geht das GroupLayout wieder einen eigenen Weg: Komponenten werden nicht per panel.add(Component c) &amp;quot;hinzugefügt&amp;quot;.&lt;br /&gt;
Man fasst die Komponenten in Gruppen zusammen und setzt diese in Beziehungen zueinander.&lt;br /&gt;
Anders als bei den GridBagConstraints wurde beim GroupLayout dieses &amp;quot;Beziehungen setzen&amp;quot; aber zweigeteilt: Man gibt die Größenverhältnisse einmal vertikal und einmal horizontal an:&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir imitieren ein FlowLayout mit 3 Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JLabel label1=new JLabel(&amp;quot;1&amp;quot;);&lt;br /&gt;
JLabel label2=new JLabel(&amp;quot;2&amp;quot;);&lt;br /&gt;
JLabel label3=new JLabel(&amp;quot;3&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 1. Beziehungen auf vertikaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Wir wollen, dass alle 3 Labels in der gleichen Zeile stehen. Sehen wir von &amp;quot;Norden&amp;quot; aus auf unser Layout drauf (man beuge sich über den Bildschirm und blicke nach unten), sind die 3 Labels nebeneinander. Wenn wir 2 oder mehr Komponenten nebeneinander ausrichten wollen, benötigen wir eine ParallelGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup verticalGroup=layout.createParallelGroup();&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser ParallelGroup werden jetzt die Komponenten hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Beziehungen auf horizontaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Sehen wir von &amp;quot;Westen&amp;quot; auf unser Layout (man stelle sich links neben den Bildschirm und blicke hinein), sind die 3 Labels hintereinander. Dafür gibts die SequentialGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup horizontalGroup=layout.createSequentialGroup;&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss müssen wir unsere erstellten Gruppen noch dem Layout mit folgenden Methoden zuweisen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setVerticalGroup(verticalGroup);&lt;br /&gt;
layout.setHorizontalGroup(horizontalGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt noch panel in einen JFrame packen und fertig, unser erstes GroupLayout läuft! &lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-1-FlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn du einen Komponenten nur zu einer Group addest, fliegt eine Exception und es wird nichts angezeigt!&lt;br /&gt;
&lt;br /&gt;
== VerticalFlowLayout ==&lt;br /&gt;
&lt;br /&gt;
Aber was nützt uns ein FlowLayout? Schon so mancher hat den Bedarf nach einem VerticalFlowLayout angemeldet. Mit GroupLayout kein Problem: wir vertauschen einfach vertical- und horizontalGroup.&lt;br /&gt;
&lt;br /&gt;
SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&lt;br /&gt;
&lt;br /&gt;
ParallelGroup horizontalGroup=layout.createParallelGroup;&lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-2-VerticalFlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
== Standard GUI ==&lt;br /&gt;
&lt;br /&gt;
Wie sieht es nun mit komplexeren Masken aus? Ich habe früher versucht aus zig verschiedenen, verschachtelten Panels mit jeweils eigenem einfachen LayoutManagern eine GUI zusammenzubasteln. Der Aufwand war enorm, die Übersichtlichkeit schrecklich, es war fehleranfällig und meist kam sowieso nicht das raus was gewollt war.&lt;br /&gt;
Mit dem GroupLayout kann man sich das Panel verschachteln sparen, man verschachtelt die Groups. Das schafft zwar das Problem des Verschachtelns nicht aus der Welt, man kann sich aber besser auf die eine Sache konzentrieren weil man sich eine Menge Panels spart.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir erweitern unser VerticalFlowGroupLayout: Da soll in jede Zeile noch zusätzlich ein Textfeld und ein Button rein:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-3-SchoeneGui.png]]&lt;br /&gt;
&lt;br /&gt;
=== 1. Vertikale Group: ===&lt;br /&gt;
&lt;br /&gt;
Wir stellen uns wieder vor, wir blicken von oben in unser Layout rein. Jetzt gibt’s zwei Betrachtungsweisen: Haben wir 3 Zeilen hintereinander, in denen je ein Label, ein Textfeld und ein Button nebeneinander stehen oder haben wir 3 Spalten nebeneinander mit jeweils 3 Labels, Textfeldern und Buttons hintereinander?&lt;br /&gt;
Die Entscheidung bleibt dir überlassen, ich werde es hier anhand des „3 Zeilen“ Ansatzes demonstrieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
        &lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Horizontale Group ===&lt;br /&gt;
&lt;br /&gt;
Analog zur Vertikalen Group: Haben wir 3 Zeilen nebeneinander in denen Label, Textfeld und Button hintereinander stehen oder haben wir 3 Spalten hintereinander, in denen untereinander je 3 Labels, Textfelder oder Buttons stehen?&lt;br /&gt;
W man sich beim Vertikalen Teil für die Zeilen Denkweise entschieden hat, ist es mMn sinnvoll dabei zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup horizontalGroup=layout.createParallelGroup();&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In meinem StandardFrame mit fixer Größe sieht das ganze nun aber so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-4-HaesslicheGui.png]]&lt;br /&gt;
&lt;br /&gt;
Die Komponenten füllen den gesamten Platz der aus – wir brauchen soetwas wie den Glue aus dem BoxLayout. Im GroupLayout heißt das Gap was die Sache mMn auch besser beschreibt (wer will denn Kleber in seiner GUI?).&lt;br /&gt;
&lt;br /&gt;
== Gaps und Größenangaben ==&lt;br /&gt;
&lt;br /&gt;
Erstens gibt’s da mal eine Komfortfunktion die man ich eigentlich immer aktiviert habe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setAutoCreateGaps(true);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kleben die Komponenten nicht mehr so aneinander, wie man das auch vom GridLayout her kennt.&lt;br /&gt;
&lt;br /&gt;
Zu unserm Problem, wir können Gaps genauso wie Komponenten einer Gruppe hinzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(Short.MAX_VALUE);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
addGap erwartet einen Integer Wert als Parameter, der angibt wie groß der Gap sein soll. Short.MAX_VALUE liegt bei ca. 32000, so große Displays gibt’s noch nicht.&lt;br /&gt;
&lt;br /&gt;
Man kann addGap aber auch 3 ints übergeben: addGap(int min,int pref, int max)&lt;br /&gt;
Man kann also Minimum, Preferred und Maximum Size einstellen. Das funktioniert genauso bei Komponenten:&lt;br /&gt;
&lt;br /&gt;
Ändern wir den Code auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
. addComponent(textField1,20,20,20)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird unser Textfield1 immer genau 20 Pixel hoch sein.&lt;br /&gt;
Achtung: Die Größenangaben beziehen sich immer auf die Achse, in der sie gemacht werden. Angaben in der VerticalGroup beeinflussen nur die Höhe, Angaben in der HorizontalGroup nur die Breite.&lt;br /&gt;
&lt;br /&gt;
Die Größenangaben manuell anzugeben ist allerdings kein sauberer Stil. Komponenten haben ja selber schon min, preferred und max Size Einstellungen, die werden dadurch einfach ignoriert. Um dem GroupLayout zu sagen, es soll immer auf eine dieser Methoden zurückgreifen gibt’s 2 Konstanten:&lt;br /&gt;
GroupLayout.DEFAULT_SIZE und GroupLayout.PREFERRED_SIZE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                .addComponent(button1)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Textfeld maximal die Höhe seiner PreferredSize haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-5-TextfeldHoehe.png]]&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir wollen links unten in unserem Fenster einen OK Button einfügen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-6-Okbutton.png]]&lt;br /&gt;
&lt;br /&gt;
Wir fügen einen Gap zwischen Zeile 3 und dem Ok Button ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(0,0,Short.MAX_VALUE);&lt;br /&gt;
verticalGroup.addComponent(okButton);&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addGap(0,0,Short.MAX_VALUE)&lt;br /&gt;
                .addComponent(okButton));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ein (0,0,Short.MAX_VALUE) Gap füllt soviel Platz aus, wie ihm zur Verfügung steht. Egal wie groß ihr das Fenster macht, der OK Button ist immer rechts unten.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Fortgeschrittenes: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir stellen die Font eines unserer Labels auf 80 und wollen, dass die Textfeld und Button in der Mitte der Zeile angezeigt werden. Wir setzten für unsere Textfelder unterschiedliche Preferred Sizes und wollen dass die Buttons alle schön untereinander stehen und gleich breit sein. Ausserdem soll das Layout nur so viel Platz wie nötig ausfüllen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-7-Fortgeschritten.png]]&lt;br /&gt;
&lt;br /&gt;
Erstmal setzten wir ganz normal die Preferred Size der Textfelder und die Font des Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;Font f = new Font( &amp;quot;Arial&amp;quot;, Font.PLAIN, 80 );&lt;br /&gt;
label1.setFont(f);&lt;br /&gt;
 &lt;br /&gt;
textField1.setPreferredSize(new Dimension(70,20));&lt;br /&gt;
textField2.setPreferredSize(new Dimension(100,20));&lt;br /&gt;
textField3.setPreferredSize(new Dimension(130,20));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 1:&#039;&#039;&#039; Die Komponenten einer Zeile der Höhe nach mittig ausrichten:&lt;br /&gt;
ParallelGroups kann man beim erzeugen einen Alignment Parameter übergeben. (Alignment. LEADING, TRAILING, CENTER oder BASELINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup(Alignment.CENTER)&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
.addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 2:&#039;&#039;&#039; Quasi ein Tabstopp für die Buttons. Wir haben nicht mehr einfach 4 Zeilen, wir haben 4 Zeilen und 2 Spalten. &lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-8-Rechtecke.png]]&lt;br /&gt;
&lt;br /&gt;
Die HorizontalGroup muss deshalb verändert werden:&lt;br /&gt;
Wir stellen uns vor, wir schauen von „Westen“/Links auf unser Layout.&lt;br /&gt;
Da wir in unserem Layout 2 Spalten haben (Rote Rechtecke), die klar abgegrenzt hintereinander kommen sollen Brauchen wir erstmal eine SequentialGroup.&lt;br /&gt;
SequentialGroup horizontalGroup=layout.createSequentialGroup();&lt;br /&gt;
&lt;br /&gt;
Jetzt betrachten wir erstmal nur das linke Rechteck (um das rechte kümmern wir uns nachher).&lt;br /&gt;
3 Zeilen übereinander mit je Label und Textfeld hintereinander oder 3 Labels übereinander, danach 3 Textfelder übereinander. (Wir machens auf die Zeilen Art).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup labelTextfieldGroup=layout.createParallelGroup()&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2)&lt;br /&gt;
                .addComponent(textField2,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3)&lt;br /&gt;
                .addComponent(textField3,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch die 4 Buttons übereinander, das ist wieder einfacher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup buttonGroup=layout.createParallelGroup(Alignment.TRAILING)&lt;br /&gt;
        .addComponent(button1)&lt;br /&gt;
        .addComponent(button2)&lt;br /&gt;
        .addComponent(button3)&lt;br /&gt;
        .addComponent(okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt stöpseln wir die zwei roten Rechteck-Gruppen zusammen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;horizontalGroup.addGroup(labelTextfieldGroup).addGroup(buttonGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 3:&#039;&#039;&#039; Den Buttons die gleiche Breite verpassen.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt’s die Funktion linkSize:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.linkSize(SwingConstants.HORIZONTAL,button1,button2,button3,okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwingConstants.HORIZONTAL gibt an ob man die Breite oder die Höhe verlinken will. Danach kann man beliebig viele Komponenten hinzuschreiben (varargs).&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links: ==&lt;br /&gt;
&lt;br /&gt;
API-Dokumentation vom [http://docs.oracle.com/javase/7/docs/api/javax/swing/GroupLayout.html GroupLayout] &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Oracle: [http://download.oracle.com/javase/tutorial/uiswing/layout/group.html How to Use GroupLayout (The Java™ Tutorials &amp;gt; Creating a GUI With JFC/Swing &amp;gt; Laying Out Components]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer: bERt0r|bERt0r]] 04:06, 16. Dez 2011 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Datei:GLTut-8-Rechtecke.png&amp;diff=5678</id>
		<title>Datei:GLTut-8-Rechtecke.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Datei:GLTut-8-Rechtecke.png&amp;diff=5678"/>
		<updated>2013-09-09T13:47:43Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Datei:GLTut-7-Fortgeschritten.png&amp;diff=5677</id>
		<title>Datei:GLTut-7-Fortgeschritten.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Datei:GLTut-7-Fortgeschritten.png&amp;diff=5677"/>
		<updated>2013-09-09T13:46:25Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5676</id>
		<title>GroupLayout für Homosapiens</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5676"/>
		<updated>2013-09-09T13:45:40Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: /* Gaps und Größenangaben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GroupLayout für Homosapiens: ==&lt;br /&gt;
&lt;br /&gt;
Das GroupLayout ist ein mächtiger LayoutManager, der leider oft als komplizierter missverstanden wird, als er eigentlich ist. Besonders GUI-Builder erzeugen meist sehr hässlichen Code mit dem Grouplayout, weshalb ich euch rate erst mal ein GroupLayout von Hand zu schreiben.&lt;br /&gt;
GroupLayout wurde mit dem Ziel geschaffen, von GUI Buildern verwendet zu werden, von Hand programmiert, liegt der Schreibaufwand etwa wie beim GridBagLayout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem JPanel ein GroupLayout zu verpassen funktioniert erstmal nicht ganz genauso wie bei anderen LayoutManagern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JPanel panel=new JPanel();&lt;br /&gt;
GroupLayout layout = new GroupLayout(panel);&lt;br /&gt;
panel.setLayout(layout);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das GroupLayout wirft sehr schnell mal Exceptions wenn bei der initialisierung etwas schief gelaufen ist (z.B ein Komponent vergessen). Davon nicht abschrecken lassen! Andere LayoutManager kaschieren manche Ungereimtheiten und zeigen trotzdem was an. Das GroupLayout ist da wohl eher auf Perfektionismus ausgelegt: richtig oder gar nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zu den Komponenten: ==&lt;br /&gt;
&lt;br /&gt;
Auch hier geht das GroupLayout wieder einen eigenen Weg: Komponenten werden nicht per panel.add(Component c) &amp;quot;hinzugefügt&amp;quot;.&lt;br /&gt;
Man fasst die Komponenten in Gruppen zusammen und setzt diese in Beziehungen zueinander.&lt;br /&gt;
Anders als bei den GridBagConstraints wurde beim GroupLayout dieses &amp;quot;Beziehungen setzen&amp;quot; aber zweigeteilt: Man gibt die Größenverhältnisse einmal vertikal und einmal horizontal an:&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir imitieren ein FlowLayout mit 3 Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JLabel label1=new JLabel(&amp;quot;1&amp;quot;);&lt;br /&gt;
JLabel label2=new JLabel(&amp;quot;2&amp;quot;);&lt;br /&gt;
JLabel label3=new JLabel(&amp;quot;3&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 1. Beziehungen auf vertikaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Wir wollen, dass alle 3 Labels in der gleichen Zeile stehen. Sehen wir von &amp;quot;Norden&amp;quot; aus auf unser Layout drauf (man beuge sich über den Bildschirm und blicke nach unten), sind die 3 Labels nebeneinander. Wenn wir 2 oder mehr Komponenten nebeneinander ausrichten wollen, benötigen wir eine ParallelGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup verticalGroup=layout.createParallelGroup();&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser ParallelGroup werden jetzt die Komponenten hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Beziehungen auf horizontaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Sehen wir von &amp;quot;Westen&amp;quot; auf unser Layout (man stelle sich links neben den Bildschirm und blicke hinein), sind die 3 Labels hintereinander. Dafür gibts die SequentialGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup horizontalGroup=layout.createSequentialGroup;&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss müssen wir unsere erstellten Gruppen noch dem Layout mit folgenden Methoden zuweisen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setVerticalGroup(verticalGroup);&lt;br /&gt;
layout.setHorizontalGroup(horizontalGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt noch panel in einen JFrame packen und fertig, unser erstes GroupLayout läuft! &lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-1-FlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn du einen Komponenten nur zu einer Group addest, fliegt eine Exception und es wird nichts angezeigt!&lt;br /&gt;
&lt;br /&gt;
== VerticalFlowLayout ==&lt;br /&gt;
&lt;br /&gt;
Aber was nützt uns ein FlowLayout? Schon so mancher hat den Bedarf nach einem VerticalFlowLayout angemeldet. Mit GroupLayout kein Problem: wir vertauschen einfach vertical- und horizontalGroup.&lt;br /&gt;
&lt;br /&gt;
SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&lt;br /&gt;
&lt;br /&gt;
ParallelGroup horizontalGroup=layout.createParallelGroup;&lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-2-VerticalFlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
== Standard GUI ==&lt;br /&gt;
&lt;br /&gt;
Wie sieht es nun mit komplexeren Masken aus? Ich habe früher versucht aus zig verschiedenen, verschachtelten Panels mit jeweils eigenem einfachen LayoutManagern eine GUI zusammenzubasteln. Der Aufwand war enorm, die Übersichtlichkeit schrecklich, es war fehleranfällig und meist kam sowieso nicht das raus was gewollt war.&lt;br /&gt;
Mit dem GroupLayout kann man sich das Panel verschachteln sparen, man verschachtelt die Groups. Das schafft zwar das Problem des Verschachtelns nicht aus der Welt, man kann sich aber besser auf die eine Sache konzentrieren weil man sich eine Menge Panels spart.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir erweitern unser VerticalFlowGroupLayout: Da soll in jede Zeile noch zusätzlich ein Textfeld und ein Button rein:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-3-SchoeneGui.png]]&lt;br /&gt;
&lt;br /&gt;
=== 1. Vertikale Group: ===&lt;br /&gt;
&lt;br /&gt;
Wir stellen uns wieder vor, wir blicken von oben in unser Layout rein. Jetzt gibt’s zwei Betrachtungsweisen: Haben wir 3 Zeilen hintereinander, in denen je ein Label, ein Textfeld und ein Button nebeneinander stehen oder haben wir 3 Spalten nebeneinander mit jeweils 3 Labels, Textfeldern und Buttons hintereinander?&lt;br /&gt;
Die Entscheidung bleibt dir überlassen, ich werde es hier anhand des „3 Zeilen“ Ansatzes demonstrieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
        &lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Horizontale Group ===&lt;br /&gt;
&lt;br /&gt;
Analog zur Vertikalen Group: Haben wir 3 Zeilen nebeneinander in denen Label, Textfeld und Button hintereinander stehen oder haben wir 3 Spalten hintereinander, in denen untereinander je 3 Labels, Textfelder oder Buttons stehen?&lt;br /&gt;
W man sich beim Vertikalen Teil für die Zeilen Denkweise entschieden hat, ist es mMn sinnvoll dabei zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup horizontalGroup=layout.createParallelGroup();&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In meinem StandardFrame mit fixer Größe sieht das ganze nun aber so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-4-HaesslicheGui.png]]&lt;br /&gt;
&lt;br /&gt;
Die Komponenten füllen den gesamten Platz der aus – wir brauchen soetwas wie den Glue aus dem BoxLayout. Im GroupLayout heißt das Gap was die Sache mMn auch besser beschreibt (wer will denn Kleber in seiner GUI?).&lt;br /&gt;
&lt;br /&gt;
== Gaps und Größenangaben ==&lt;br /&gt;
&lt;br /&gt;
Erstens gibt’s da mal eine Komfortfunktion die man ich eigentlich immer aktiviert habe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setAutoCreateGaps(true);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kleben die Komponenten nicht mehr so aneinander, wie man das auch vom GridLayout her kennt.&lt;br /&gt;
&lt;br /&gt;
Zu unserm Problem, wir können Gaps genauso wie Komponenten einer Gruppe hinzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(Short.MAX_VALUE);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
addGap erwartet einen Integer Wert als Parameter, der angibt wie groß der Gap sein soll. Short.MAX_VALUE liegt bei ca. 32000, so große Displays gibt’s noch nicht.&lt;br /&gt;
&lt;br /&gt;
Man kann addGap aber auch 3 ints übergeben: addGap(int min,int pref, int max)&lt;br /&gt;
Man kann also Minimum, Preferred und Maximum Size einstellen. Das funktioniert genauso bei Komponenten:&lt;br /&gt;
&lt;br /&gt;
Ändern wir den Code auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
. addComponent(textField1,20,20,20)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird unser Textfield1 immer genau 20 Pixel hoch sein.&lt;br /&gt;
Achtung: Die Größenangaben beziehen sich immer auf die Achse, in der sie gemacht werden. Angaben in der VerticalGroup beeinflussen nur die Höhe, Angaben in der HorizontalGroup nur die Breite.&lt;br /&gt;
&lt;br /&gt;
Die Größenangaben manuell anzugeben ist allerdings kein sauberer Stil. Komponenten haben ja selber schon min, preferred und max Size Einstellungen, die werden dadurch einfach ignoriert. Um dem GroupLayout zu sagen, es soll immer auf eine dieser Methoden zurückgreifen gibt’s 2 Konstanten:&lt;br /&gt;
GroupLayout.DEFAULT_SIZE und GroupLayout.PREFERRED_SIZE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                .addComponent(button1)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Textfeld maximal die Höhe seiner PreferredSize haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-5-TextfeldHoehe.png]]&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir wollen links unten in unserem Fenster einen OK Button einfügen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-6-Okbutton.png]]&lt;br /&gt;
&lt;br /&gt;
Wir fügen einen Gap zwischen Zeile 3 und dem Ok Button ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(0,0,Short.MAX_VALUE);&lt;br /&gt;
verticalGroup.addComponent(okButton);&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addGap(0,0,Short.MAX_VALUE)&lt;br /&gt;
                .addComponent(okButton));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ein (0,0,Short.MAX_VALUE) Gap füllt soviel Platz aus, wie ihm zur Verfügung steht. Egal wie groß ihr das Fenster macht, der OK Button ist immer rechts unten.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Fortgeschrittenes: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir stellen die Font eines unserer Labels auf 80 und wollen, dass die Textfeld und Button in der Mitte der Zeile angezeigt werden. Wir setzten für unsere Textfelder unterschiedliche Preferred Sizes und wollen dass die Buttons alle schön untereinander stehen und gleich breit sein. Ausserdem soll das Layout nur so viel Platz wie nötig ausfüllen.&lt;br /&gt;
&lt;br /&gt;
Erstmal setzten wir ganz normal die Preferred Size der Textfelder und die Font des Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;Font f = new Font( &amp;quot;Arial&amp;quot;, Font.PLAIN, 80 );&lt;br /&gt;
label1.setFont(f);&lt;br /&gt;
 &lt;br /&gt;
textField1.setPreferredSize(new Dimension(70,20));&lt;br /&gt;
textField2.setPreferredSize(new Dimension(100,20));&lt;br /&gt;
textField3.setPreferredSize(new Dimension(130,20));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 1:&#039;&#039;&#039; Die Komponenten einer Zeile der Höhe nach mittig ausrichten:&lt;br /&gt;
ParallelGroups kann man beim erzeugen einen Alignment Parameter übergeben. (Alignment. LEADING, TRAILING, CENTER oder BASELINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup(Alignment.CENTER)&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
.addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 2:&#039;&#039;&#039; Quasi ein Tabstopp für die Buttons. Wir haben nicht mehr einfach 4 Zeilen, wir haben 4 Zeilen und 2 Spalten. &lt;br /&gt;
&lt;br /&gt;
Die HorizontalGroup muss deshalb verändert werden:&lt;br /&gt;
Wir stellen uns vor, wir schauen von „Westen“/Links auf unser Layout.&lt;br /&gt;
Da wir in unserem Layout 2 Spalten haben (Rote Rechtecke), die klar abgegrenzt hintereinander kommen sollen Brauchen wir erstmal eine SequentialGroup.&lt;br /&gt;
SequentialGroup horizontalGroup=layout.createSequentialGroup();&lt;br /&gt;
&lt;br /&gt;
Jetzt betrachten wir erstmal nur das linke Rechteck (um das rechte kümmern wir uns nachher).&lt;br /&gt;
3 Zeilen übereinander mit je Label und Textfeld hintereinander oder 3 Labels übereinander, danach 3 Textfelder übereinander. (Wir machens auf die Zeilen Art).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup labelTextfieldGroup=layout.createParallelGroup()&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2)&lt;br /&gt;
                .addComponent(textField2,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3)&lt;br /&gt;
                .addComponent(textField3,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch die 4 Buttons übereinander, das ist wieder einfacher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup buttonGroup=layout.createParallelGroup(Alignment.TRAILING)&lt;br /&gt;
        .addComponent(button1)&lt;br /&gt;
        .addComponent(button2)&lt;br /&gt;
        .addComponent(button3)&lt;br /&gt;
        .addComponent(okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt stöpseln wir die zwei roten Rechteck-Gruppen zusammen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;horizontalGroup.addGroup(labelTextfieldGroup).addGroup(buttonGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 3:&#039;&#039;&#039; Den Buttons die gleiche Breite verpassen.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt’s die Funktion linkSize:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.linkSize(SwingConstants.HORIZONTAL,button1,button2,button3,okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwingConstants.HORIZONTAL gibt an ob man die Breite oder die Höhe verlinken will. Danach kann man beliebig viele Komponenten hinzuschreiben (varargs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links: ==&lt;br /&gt;
&lt;br /&gt;
API-Dokumentation vom [http://docs.oracle.com/javase/7/docs/api/javax/swing/GroupLayout.html GroupLayout] &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Oracle: [http://download.oracle.com/javase/tutorial/uiswing/layout/group.html How to Use GroupLayout (The Java™ Tutorials &amp;gt; Creating a GUI With JFC/Swing &amp;gt; Laying Out Components]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer: bERt0r|bERt0r]] 04:06, 16. Dez 2011 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Datei:GLTut-6-Okbutton.png&amp;diff=5675</id>
		<title>Datei:GLTut-6-Okbutton.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Datei:GLTut-6-Okbutton.png&amp;diff=5675"/>
		<updated>2013-09-09T13:45:12Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Datei:GLTut-5-TextfeldHoehe.png&amp;diff=5674</id>
		<title>Datei:GLTut-5-TextfeldHoehe.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Datei:GLTut-5-TextfeldHoehe.png&amp;diff=5674"/>
		<updated>2013-09-09T13:43:47Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5673</id>
		<title>GroupLayout für Homosapiens</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5673"/>
		<updated>2013-09-09T13:41:21Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: /* 2. Horizontale Group */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GroupLayout für Homosapiens: ==&lt;br /&gt;
&lt;br /&gt;
Das GroupLayout ist ein mächtiger LayoutManager, der leider oft als komplizierter missverstanden wird, als er eigentlich ist. Besonders GUI-Builder erzeugen meist sehr hässlichen Code mit dem Grouplayout, weshalb ich euch rate erst mal ein GroupLayout von Hand zu schreiben.&lt;br /&gt;
GroupLayout wurde mit dem Ziel geschaffen, von GUI Buildern verwendet zu werden, von Hand programmiert, liegt der Schreibaufwand etwa wie beim GridBagLayout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem JPanel ein GroupLayout zu verpassen funktioniert erstmal nicht ganz genauso wie bei anderen LayoutManagern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JPanel panel=new JPanel();&lt;br /&gt;
GroupLayout layout = new GroupLayout(panel);&lt;br /&gt;
panel.setLayout(layout);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das GroupLayout wirft sehr schnell mal Exceptions wenn bei der initialisierung etwas schief gelaufen ist (z.B ein Komponent vergessen). Davon nicht abschrecken lassen! Andere LayoutManager kaschieren manche Ungereimtheiten und zeigen trotzdem was an. Das GroupLayout ist da wohl eher auf Perfektionismus ausgelegt: richtig oder gar nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zu den Komponenten: ==&lt;br /&gt;
&lt;br /&gt;
Auch hier geht das GroupLayout wieder einen eigenen Weg: Komponenten werden nicht per panel.add(Component c) &amp;quot;hinzugefügt&amp;quot;.&lt;br /&gt;
Man fasst die Komponenten in Gruppen zusammen und setzt diese in Beziehungen zueinander.&lt;br /&gt;
Anders als bei den GridBagConstraints wurde beim GroupLayout dieses &amp;quot;Beziehungen setzen&amp;quot; aber zweigeteilt: Man gibt die Größenverhältnisse einmal vertikal und einmal horizontal an:&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir imitieren ein FlowLayout mit 3 Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JLabel label1=new JLabel(&amp;quot;1&amp;quot;);&lt;br /&gt;
JLabel label2=new JLabel(&amp;quot;2&amp;quot;);&lt;br /&gt;
JLabel label3=new JLabel(&amp;quot;3&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 1. Beziehungen auf vertikaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Wir wollen, dass alle 3 Labels in der gleichen Zeile stehen. Sehen wir von &amp;quot;Norden&amp;quot; aus auf unser Layout drauf (man beuge sich über den Bildschirm und blicke nach unten), sind die 3 Labels nebeneinander. Wenn wir 2 oder mehr Komponenten nebeneinander ausrichten wollen, benötigen wir eine ParallelGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup verticalGroup=layout.createParallelGroup();&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser ParallelGroup werden jetzt die Komponenten hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Beziehungen auf horizontaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Sehen wir von &amp;quot;Westen&amp;quot; auf unser Layout (man stelle sich links neben den Bildschirm und blicke hinein), sind die 3 Labels hintereinander. Dafür gibts die SequentialGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup horizontalGroup=layout.createSequentialGroup;&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss müssen wir unsere erstellten Gruppen noch dem Layout mit folgenden Methoden zuweisen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setVerticalGroup(verticalGroup);&lt;br /&gt;
layout.setHorizontalGroup(horizontalGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt noch panel in einen JFrame packen und fertig, unser erstes GroupLayout läuft! &lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-1-FlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn du einen Komponenten nur zu einer Group addest, fliegt eine Exception und es wird nichts angezeigt!&lt;br /&gt;
&lt;br /&gt;
== VerticalFlowLayout ==&lt;br /&gt;
&lt;br /&gt;
Aber was nützt uns ein FlowLayout? Schon so mancher hat den Bedarf nach einem VerticalFlowLayout angemeldet. Mit GroupLayout kein Problem: wir vertauschen einfach vertical- und horizontalGroup.&lt;br /&gt;
&lt;br /&gt;
SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&lt;br /&gt;
&lt;br /&gt;
ParallelGroup horizontalGroup=layout.createParallelGroup;&lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-2-VerticalFlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
== Standard GUI ==&lt;br /&gt;
&lt;br /&gt;
Wie sieht es nun mit komplexeren Masken aus? Ich habe früher versucht aus zig verschiedenen, verschachtelten Panels mit jeweils eigenem einfachen LayoutManagern eine GUI zusammenzubasteln. Der Aufwand war enorm, die Übersichtlichkeit schrecklich, es war fehleranfällig und meist kam sowieso nicht das raus was gewollt war.&lt;br /&gt;
Mit dem GroupLayout kann man sich das Panel verschachteln sparen, man verschachtelt die Groups. Das schafft zwar das Problem des Verschachtelns nicht aus der Welt, man kann sich aber besser auf die eine Sache konzentrieren weil man sich eine Menge Panels spart.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir erweitern unser VerticalFlowGroupLayout: Da soll in jede Zeile noch zusätzlich ein Textfeld und ein Button rein:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-3-SchoeneGui.png]]&lt;br /&gt;
&lt;br /&gt;
=== 1. Vertikale Group: ===&lt;br /&gt;
&lt;br /&gt;
Wir stellen uns wieder vor, wir blicken von oben in unser Layout rein. Jetzt gibt’s zwei Betrachtungsweisen: Haben wir 3 Zeilen hintereinander, in denen je ein Label, ein Textfeld und ein Button nebeneinander stehen oder haben wir 3 Spalten nebeneinander mit jeweils 3 Labels, Textfeldern und Buttons hintereinander?&lt;br /&gt;
Die Entscheidung bleibt dir überlassen, ich werde es hier anhand des „3 Zeilen“ Ansatzes demonstrieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
        &lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Horizontale Group ===&lt;br /&gt;
&lt;br /&gt;
Analog zur Vertikalen Group: Haben wir 3 Zeilen nebeneinander in denen Label, Textfeld und Button hintereinander stehen oder haben wir 3 Spalten hintereinander, in denen untereinander je 3 Labels, Textfelder oder Buttons stehen?&lt;br /&gt;
W man sich beim Vertikalen Teil für die Zeilen Denkweise entschieden hat, ist es mMn sinnvoll dabei zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup horizontalGroup=layout.createParallelGroup();&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In meinem StandardFrame mit fixer Größe sieht das ganze nun aber so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-4-HaesslicheGui.png]]&lt;br /&gt;
&lt;br /&gt;
Die Komponenten füllen den gesamten Platz der aus – wir brauchen soetwas wie den Glue aus dem BoxLayout. Im GroupLayout heißt das Gap was die Sache mMn auch besser beschreibt (wer will denn Kleber in seiner GUI?).&lt;br /&gt;
&lt;br /&gt;
== Gaps und Größenangaben ==&lt;br /&gt;
&lt;br /&gt;
Erstens gibt’s da mal eine Komfortfunktion die man ich eigentlich immer aktiviert habe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setAutoCreateGaps(true);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kleben die Komponenten nicht mehr so aneinander, wie man das auch vom GridLayout her kennt.&lt;br /&gt;
&lt;br /&gt;
Zu unserm Problem, wir können Gaps genauso wie Komponenten einer Gruppe hinzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(Short.MAX_VALUE);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
addGap erwartet einen Integer Wert als Parameter, der angibt wie groß der Gap sein soll. Short.MAX_VALUE liegt bei ca. 32000, so große Displays gibt’s noch nicht.&lt;br /&gt;
&lt;br /&gt;
Man kann addGap aber auch 3 ints übergeben: addGap(int min,int pref, int max)&lt;br /&gt;
Man kann also Minimum, Preferred und Maximum Size einstellen. Das funktioniert genauso bei Komponenten:&lt;br /&gt;
&lt;br /&gt;
Ändern wir den Code auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
. addComponent(textField1,20,20,20)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird unser Textfield1 immer genau 20 Pixel hoch sein.&lt;br /&gt;
Achtung: Die Größenangaben beziehen sich immer auf die Achse, in der sie gemacht werden. Angaben in der VerticalGroup beeinflussen nur die Höhe, Angaben in der HorizontalGroup nur die Breite.&lt;br /&gt;
&lt;br /&gt;
Die Größenangaben manuell anzugeben ist allerdings kein sauberer Stil. Komponenten haben ja selber schon min, preferred und max Size Einstellungen, die werden dadurch einfach ignoriert. Um dem GroupLayout zu sagen, es soll immer auf eine dieser Methoden zurückgreifen gibt’s 2 Konstanten:&lt;br /&gt;
GroupLayout.DEFAULT_SIZE und GroupLayout.PREFERRED_SIZE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                .addComponent(button1)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Textfeld maximal die Höhe seiner PreferredSize haben.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir wollen links unten in unserem Fenster einen OK Button einfügen.&lt;br /&gt;
&lt;br /&gt;
Wir fügen einen Gap zwischen Zeile 3 und dem Ok Button ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(0,0,Short.MAX_VALUE);&lt;br /&gt;
verticalGroup.addComponent(okButton);&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addGap(0,0,Short.MAX_VALUE)&lt;br /&gt;
                .addComponent(okButton));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ein (0,0,Short.MAX_VALUE) Gap füllt soviel Platz aus, wie ihm zur Verfügung steht. Egal wie groß ihr das Fenster macht, der OK Button ist immer rechts unten.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Fortgeschrittenes: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir stellen die Font eines unserer Labels auf 80 und wollen, dass die Textfeld und Button in der Mitte der Zeile angezeigt werden. Wir setzten für unsere Textfelder unterschiedliche Preferred Sizes und wollen dass die Buttons alle schön untereinander stehen und gleich breit sein. Ausserdem soll das Layout nur so viel Platz wie nötig ausfüllen.&lt;br /&gt;
&lt;br /&gt;
Erstmal setzten wir ganz normal die Preferred Size der Textfelder und die Font des Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;Font f = new Font( &amp;quot;Arial&amp;quot;, Font.PLAIN, 80 );&lt;br /&gt;
label1.setFont(f);&lt;br /&gt;
 &lt;br /&gt;
textField1.setPreferredSize(new Dimension(70,20));&lt;br /&gt;
textField2.setPreferredSize(new Dimension(100,20));&lt;br /&gt;
textField3.setPreferredSize(new Dimension(130,20));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 1:&#039;&#039;&#039; Die Komponenten einer Zeile der Höhe nach mittig ausrichten:&lt;br /&gt;
ParallelGroups kann man beim erzeugen einen Alignment Parameter übergeben. (Alignment. LEADING, TRAILING, CENTER oder BASELINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup(Alignment.CENTER)&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
.addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 2:&#039;&#039;&#039; Quasi ein Tabstopp für die Buttons. Wir haben nicht mehr einfach 4 Zeilen, wir haben 4 Zeilen und 2 Spalten. &lt;br /&gt;
&lt;br /&gt;
Die HorizontalGroup muss deshalb verändert werden:&lt;br /&gt;
Wir stellen uns vor, wir schauen von „Westen“/Links auf unser Layout.&lt;br /&gt;
Da wir in unserem Layout 2 Spalten haben (Rote Rechtecke), die klar abgegrenzt hintereinander kommen sollen Brauchen wir erstmal eine SequentialGroup.&lt;br /&gt;
SequentialGroup horizontalGroup=layout.createSequentialGroup();&lt;br /&gt;
&lt;br /&gt;
Jetzt betrachten wir erstmal nur das linke Rechteck (um das rechte kümmern wir uns nachher).&lt;br /&gt;
3 Zeilen übereinander mit je Label und Textfeld hintereinander oder 3 Labels übereinander, danach 3 Textfelder übereinander. (Wir machens auf die Zeilen Art).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup labelTextfieldGroup=layout.createParallelGroup()&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2)&lt;br /&gt;
                .addComponent(textField2,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3)&lt;br /&gt;
                .addComponent(textField3,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch die 4 Buttons übereinander, das ist wieder einfacher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup buttonGroup=layout.createParallelGroup(Alignment.TRAILING)&lt;br /&gt;
        .addComponent(button1)&lt;br /&gt;
        .addComponent(button2)&lt;br /&gt;
        .addComponent(button3)&lt;br /&gt;
        .addComponent(okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt stöpseln wir die zwei roten Rechteck-Gruppen zusammen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;horizontalGroup.addGroup(labelTextfieldGroup).addGroup(buttonGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 3:&#039;&#039;&#039; Den Buttons die gleiche Breite verpassen.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt’s die Funktion linkSize:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.linkSize(SwingConstants.HORIZONTAL,button1,button2,button3,okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwingConstants.HORIZONTAL gibt an ob man die Breite oder die Höhe verlinken will. Danach kann man beliebig viele Komponenten hinzuschreiben (varargs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links: ==&lt;br /&gt;
&lt;br /&gt;
API-Dokumentation vom [http://docs.oracle.com/javase/7/docs/api/javax/swing/GroupLayout.html GroupLayout] &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Oracle: [http://download.oracle.com/javase/tutorial/uiswing/layout/group.html How to Use GroupLayout (The Java™ Tutorials &amp;gt; Creating a GUI With JFC/Swing &amp;gt; Laying Out Components]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer: bERt0r|bERt0r]] 04:06, 16. Dez 2011 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5672</id>
		<title>GroupLayout für Homosapiens</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5672"/>
		<updated>2013-09-09T13:37:47Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: /* VerticalFlowLayout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GroupLayout für Homosapiens: ==&lt;br /&gt;
&lt;br /&gt;
Das GroupLayout ist ein mächtiger LayoutManager, der leider oft als komplizierter missverstanden wird, als er eigentlich ist. Besonders GUI-Builder erzeugen meist sehr hässlichen Code mit dem Grouplayout, weshalb ich euch rate erst mal ein GroupLayout von Hand zu schreiben.&lt;br /&gt;
GroupLayout wurde mit dem Ziel geschaffen, von GUI Buildern verwendet zu werden, von Hand programmiert, liegt der Schreibaufwand etwa wie beim GridBagLayout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem JPanel ein GroupLayout zu verpassen funktioniert erstmal nicht ganz genauso wie bei anderen LayoutManagern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JPanel panel=new JPanel();&lt;br /&gt;
GroupLayout layout = new GroupLayout(panel);&lt;br /&gt;
panel.setLayout(layout);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das GroupLayout wirft sehr schnell mal Exceptions wenn bei der initialisierung etwas schief gelaufen ist (z.B ein Komponent vergessen). Davon nicht abschrecken lassen! Andere LayoutManager kaschieren manche Ungereimtheiten und zeigen trotzdem was an. Das GroupLayout ist da wohl eher auf Perfektionismus ausgelegt: richtig oder gar nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zu den Komponenten: ==&lt;br /&gt;
&lt;br /&gt;
Auch hier geht das GroupLayout wieder einen eigenen Weg: Komponenten werden nicht per panel.add(Component c) &amp;quot;hinzugefügt&amp;quot;.&lt;br /&gt;
Man fasst die Komponenten in Gruppen zusammen und setzt diese in Beziehungen zueinander.&lt;br /&gt;
Anders als bei den GridBagConstraints wurde beim GroupLayout dieses &amp;quot;Beziehungen setzen&amp;quot; aber zweigeteilt: Man gibt die Größenverhältnisse einmal vertikal und einmal horizontal an:&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir imitieren ein FlowLayout mit 3 Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JLabel label1=new JLabel(&amp;quot;1&amp;quot;);&lt;br /&gt;
JLabel label2=new JLabel(&amp;quot;2&amp;quot;);&lt;br /&gt;
JLabel label3=new JLabel(&amp;quot;3&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 1. Beziehungen auf vertikaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Wir wollen, dass alle 3 Labels in der gleichen Zeile stehen. Sehen wir von &amp;quot;Norden&amp;quot; aus auf unser Layout drauf (man beuge sich über den Bildschirm und blicke nach unten), sind die 3 Labels nebeneinander. Wenn wir 2 oder mehr Komponenten nebeneinander ausrichten wollen, benötigen wir eine ParallelGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup verticalGroup=layout.createParallelGroup();&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser ParallelGroup werden jetzt die Komponenten hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Beziehungen auf horizontaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Sehen wir von &amp;quot;Westen&amp;quot; auf unser Layout (man stelle sich links neben den Bildschirm und blicke hinein), sind die 3 Labels hintereinander. Dafür gibts die SequentialGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup horizontalGroup=layout.createSequentialGroup;&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss müssen wir unsere erstellten Gruppen noch dem Layout mit folgenden Methoden zuweisen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setVerticalGroup(verticalGroup);&lt;br /&gt;
layout.setHorizontalGroup(horizontalGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt noch panel in einen JFrame packen und fertig, unser erstes GroupLayout läuft! &lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-1-FlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn du einen Komponenten nur zu einer Group addest, fliegt eine Exception und es wird nichts angezeigt!&lt;br /&gt;
&lt;br /&gt;
== VerticalFlowLayout ==&lt;br /&gt;
&lt;br /&gt;
Aber was nützt uns ein FlowLayout? Schon so mancher hat den Bedarf nach einem VerticalFlowLayout angemeldet. Mit GroupLayout kein Problem: wir vertauschen einfach vertical- und horizontalGroup.&lt;br /&gt;
&lt;br /&gt;
SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&lt;br /&gt;
&lt;br /&gt;
ParallelGroup horizontalGroup=layout.createParallelGroup;&lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-2-VerticalFlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
== Standard GUI ==&lt;br /&gt;
&lt;br /&gt;
Wie sieht es nun mit komplexeren Masken aus? Ich habe früher versucht aus zig verschiedenen, verschachtelten Panels mit jeweils eigenem einfachen LayoutManagern eine GUI zusammenzubasteln. Der Aufwand war enorm, die Übersichtlichkeit schrecklich, es war fehleranfällig und meist kam sowieso nicht das raus was gewollt war.&lt;br /&gt;
Mit dem GroupLayout kann man sich das Panel verschachteln sparen, man verschachtelt die Groups. Das schafft zwar das Problem des Verschachtelns nicht aus der Welt, man kann sich aber besser auf die eine Sache konzentrieren weil man sich eine Menge Panels spart.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir erweitern unser VerticalFlowGroupLayout: Da soll in jede Zeile noch zusätzlich ein Textfeld und ein Button rein:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-3-SchoeneGui.png]]&lt;br /&gt;
&lt;br /&gt;
=== 1. Vertikale Group: ===&lt;br /&gt;
&lt;br /&gt;
Wir stellen uns wieder vor, wir blicken von oben in unser Layout rein. Jetzt gibt’s zwei Betrachtungsweisen: Haben wir 3 Zeilen hintereinander, in denen je ein Label, ein Textfeld und ein Button nebeneinander stehen oder haben wir 3 Spalten nebeneinander mit jeweils 3 Labels, Textfeldern und Buttons hintereinander?&lt;br /&gt;
Die Entscheidung bleibt dir überlassen, ich werde es hier anhand des „3 Zeilen“ Ansatzes demonstrieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
        &lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Horizontale Group ===&lt;br /&gt;
&lt;br /&gt;
Analog zur Vertikalen Group: Haben wir 3 Zeilen nebeneinander in denen Label, Textfeld und Button hintereinander stehen oder haben wir 3 Spalten hintereinander, in denen untereinander je 3 Labels, Textfelder oder Buttons stehen?&lt;br /&gt;
W man sich beim Vertikalen Teil für die Zeilen Denkweise entschieden hat, ist es mMn sinnvoll dabei zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup horizontalGroup=layout.createParallelGroup();&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In meinem StandardFrame mit fixer Größe sieht das ganze nun aber so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-4-HaesslicheGui.png]]&lt;br /&gt;
&lt;br /&gt;
Die Komponenten füllen den gesamten Platz der aus – wir brauchen sowas wie einen Glue aus dem BoxLayout. Im GroupLayout heißt das Gap.&lt;br /&gt;
&lt;br /&gt;
== Gaps und Größenangaben ==&lt;br /&gt;
&lt;br /&gt;
Erstens gibt’s da mal eine Komfortfunktion die man ich eigentlich immer aktiviert habe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setAutoCreateGaps(true);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kleben die Komponenten nicht mehr so aneinander, wie man das auch vom GridLayout her kennt.&lt;br /&gt;
&lt;br /&gt;
Zu unserm Problem, wir können Gaps genauso wie Komponenten einer Gruppe hinzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(Short.MAX_VALUE);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
addGap erwartet einen Integer Wert als Parameter, der angibt wie groß der Gap sein soll. Short.MAX_VALUE liegt bei ca. 32000, so große Displays gibt’s noch nicht.&lt;br /&gt;
&lt;br /&gt;
Man kann addGap aber auch 3 ints übergeben: addGap(int min,int pref, int max)&lt;br /&gt;
Man kann also Minimum, Preferred und Maximum Size einstellen. Das funktioniert genauso bei Komponenten:&lt;br /&gt;
&lt;br /&gt;
Ändern wir den Code auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
. addComponent(textField1,20,20,20)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird unser Textfield1 immer genau 20 Pixel hoch sein.&lt;br /&gt;
Achtung: Die Größenangaben beziehen sich immer auf die Achse, in der sie gemacht werden. Angaben in der VerticalGroup beeinflussen nur die Höhe, Angaben in der HorizontalGroup nur die Breite.&lt;br /&gt;
&lt;br /&gt;
Die Größenangaben manuell anzugeben ist allerdings kein sauberer Stil. Komponenten haben ja selber schon min, preferred und max Size Einstellungen, die werden dadurch einfach ignoriert. Um dem GroupLayout zu sagen, es soll immer auf eine dieser Methoden zurückgreifen gibt’s 2 Konstanten:&lt;br /&gt;
GroupLayout.DEFAULT_SIZE und GroupLayout.PREFERRED_SIZE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                .addComponent(button1)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Textfeld maximal die Höhe seiner PreferredSize haben.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir wollen links unten in unserem Fenster einen OK Button einfügen.&lt;br /&gt;
&lt;br /&gt;
Wir fügen einen Gap zwischen Zeile 3 und dem Ok Button ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(0,0,Short.MAX_VALUE);&lt;br /&gt;
verticalGroup.addComponent(okButton);&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addGap(0,0,Short.MAX_VALUE)&lt;br /&gt;
                .addComponent(okButton));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ein (0,0,Short.MAX_VALUE) Gap füllt soviel Platz aus, wie ihm zur Verfügung steht. Egal wie groß ihr das Fenster macht, der OK Button ist immer rechts unten.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Fortgeschrittenes: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir stellen die Font eines unserer Labels auf 80 und wollen, dass die Textfeld und Button in der Mitte der Zeile angezeigt werden. Wir setzten für unsere Textfelder unterschiedliche Preferred Sizes und wollen dass die Buttons alle schön untereinander stehen und gleich breit sein. Ausserdem soll das Layout nur so viel Platz wie nötig ausfüllen.&lt;br /&gt;
&lt;br /&gt;
Erstmal setzten wir ganz normal die Preferred Size der Textfelder und die Font des Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;Font f = new Font( &amp;quot;Arial&amp;quot;, Font.PLAIN, 80 );&lt;br /&gt;
label1.setFont(f);&lt;br /&gt;
 &lt;br /&gt;
textField1.setPreferredSize(new Dimension(70,20));&lt;br /&gt;
textField2.setPreferredSize(new Dimension(100,20));&lt;br /&gt;
textField3.setPreferredSize(new Dimension(130,20));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 1:&#039;&#039;&#039; Die Komponenten einer Zeile der Höhe nach mittig ausrichten:&lt;br /&gt;
ParallelGroups kann man beim erzeugen einen Alignment Parameter übergeben. (Alignment. LEADING, TRAILING, CENTER oder BASELINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup(Alignment.CENTER)&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
.addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 2:&#039;&#039;&#039; Quasi ein Tabstopp für die Buttons. Wir haben nicht mehr einfach 4 Zeilen, wir haben 4 Zeilen und 2 Spalten. &lt;br /&gt;
&lt;br /&gt;
Die HorizontalGroup muss deshalb verändert werden:&lt;br /&gt;
Wir stellen uns vor, wir schauen von „Westen“/Links auf unser Layout.&lt;br /&gt;
Da wir in unserem Layout 2 Spalten haben (Rote Rechtecke), die klar abgegrenzt hintereinander kommen sollen Brauchen wir erstmal eine SequentialGroup.&lt;br /&gt;
SequentialGroup horizontalGroup=layout.createSequentialGroup();&lt;br /&gt;
&lt;br /&gt;
Jetzt betrachten wir erstmal nur das linke Rechteck (um das rechte kümmern wir uns nachher).&lt;br /&gt;
3 Zeilen übereinander mit je Label und Textfeld hintereinander oder 3 Labels übereinander, danach 3 Textfelder übereinander. (Wir machens auf die Zeilen Art).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup labelTextfieldGroup=layout.createParallelGroup()&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2)&lt;br /&gt;
                .addComponent(textField2,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3)&lt;br /&gt;
                .addComponent(textField3,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch die 4 Buttons übereinander, das ist wieder einfacher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup buttonGroup=layout.createParallelGroup(Alignment.TRAILING)&lt;br /&gt;
        .addComponent(button1)&lt;br /&gt;
        .addComponent(button2)&lt;br /&gt;
        .addComponent(button3)&lt;br /&gt;
        .addComponent(okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt stöpseln wir die zwei roten Rechteck-Gruppen zusammen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;horizontalGroup.addGroup(labelTextfieldGroup).addGroup(buttonGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 3:&#039;&#039;&#039; Den Buttons die gleiche Breite verpassen.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt’s die Funktion linkSize:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.linkSize(SwingConstants.HORIZONTAL,button1,button2,button3,okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwingConstants.HORIZONTAL gibt an ob man die Breite oder die Höhe verlinken will. Danach kann man beliebig viele Komponenten hinzuschreiben (varargs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links: ==&lt;br /&gt;
&lt;br /&gt;
API-Dokumentation vom [http://docs.oracle.com/javase/7/docs/api/javax/swing/GroupLayout.html GroupLayout] &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Oracle: [http://download.oracle.com/javase/tutorial/uiswing/layout/group.html How to Use GroupLayout (The Java™ Tutorials &amp;gt; Creating a GUI With JFC/Swing &amp;gt; Laying Out Components]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer: bERt0r|bERt0r]] 04:06, 16. Dez 2011 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Datei:GLTut-4-HaesslicheGui.png&amp;diff=5671</id>
		<title>Datei:GLTut-4-HaesslicheGui.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Datei:GLTut-4-HaesslicheGui.png&amp;diff=5671"/>
		<updated>2013-09-09T13:37:34Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Datei:GLTut-3-SchoeneGui.png&amp;diff=5670</id>
		<title>Datei:GLTut-3-SchoeneGui.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Datei:GLTut-3-SchoeneGui.png&amp;diff=5670"/>
		<updated>2013-09-09T13:36:22Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Datei:GLTut-2-VerticalFlowLayout.png&amp;diff=5669</id>
		<title>Datei:GLTut-2-VerticalFlowLayout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Datei:GLTut-2-VerticalFlowLayout.png&amp;diff=5669"/>
		<updated>2013-09-09T13:25:15Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: Ein VerticalFlowLayout mithilfe des Grouplayuts.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein VerticalFlowLayout mithilfe des Grouplayuts.&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5668</id>
		<title>GroupLayout für Homosapiens</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5668"/>
		<updated>2013-09-09T13:24:12Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: /* 2. Beziehungen auf horizontaler Ebene: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GroupLayout für Homosapiens: ==&lt;br /&gt;
&lt;br /&gt;
Das GroupLayout ist ein mächtiger LayoutManager, der leider oft als komplizierter missverstanden wird, als er eigentlich ist. Besonders GUI-Builder erzeugen meist sehr hässlichen Code mit dem Grouplayout, weshalb ich euch rate erst mal ein GroupLayout von Hand zu schreiben.&lt;br /&gt;
GroupLayout wurde mit dem Ziel geschaffen, von GUI Buildern verwendet zu werden, von Hand programmiert, liegt der Schreibaufwand etwa wie beim GridBagLayout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem JPanel ein GroupLayout zu verpassen funktioniert erstmal nicht ganz genauso wie bei anderen LayoutManagern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JPanel panel=new JPanel();&lt;br /&gt;
GroupLayout layout = new GroupLayout(panel);&lt;br /&gt;
panel.setLayout(layout);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das GroupLayout wirft sehr schnell mal Exceptions wenn bei der initialisierung etwas schief gelaufen ist (z.B ein Komponent vergessen). Davon nicht abschrecken lassen! Andere LayoutManager kaschieren manche Ungereimtheiten und zeigen trotzdem was an. Das GroupLayout ist da wohl eher auf Perfektionismus ausgelegt: richtig oder gar nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zu den Komponenten: ==&lt;br /&gt;
&lt;br /&gt;
Auch hier geht das GroupLayout wieder einen eigenen Weg: Komponenten werden nicht per panel.add(Component c) &amp;quot;hinzugefügt&amp;quot;.&lt;br /&gt;
Man fasst die Komponenten in Gruppen zusammen und setzt diese in Beziehungen zueinander.&lt;br /&gt;
Anders als bei den GridBagConstraints wurde beim GroupLayout dieses &amp;quot;Beziehungen setzen&amp;quot; aber zweigeteilt: Man gibt die Größenverhältnisse einmal vertikal und einmal horizontal an:&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir imitieren ein FlowLayout mit 3 Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JLabel label1=new JLabel(&amp;quot;1&amp;quot;);&lt;br /&gt;
JLabel label2=new JLabel(&amp;quot;2&amp;quot;);&lt;br /&gt;
JLabel label3=new JLabel(&amp;quot;3&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 1. Beziehungen auf vertikaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Wir wollen, dass alle 3 Labels in der gleichen Zeile stehen. Sehen wir von &amp;quot;Norden&amp;quot; aus auf unser Layout drauf (man beuge sich über den Bildschirm und blicke nach unten), sind die 3 Labels nebeneinander. Wenn wir 2 oder mehr Komponenten nebeneinander ausrichten wollen, benötigen wir eine ParallelGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup verticalGroup=layout.createParallelGroup();&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser ParallelGroup werden jetzt die Komponenten hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Beziehungen auf horizontaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Sehen wir von &amp;quot;Westen&amp;quot; auf unser Layout (man stelle sich links neben den Bildschirm und blicke hinein), sind die 3 Labels hintereinander. Dafür gibts die SequentialGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup horizontalGroup=layout.createSequentialGroup;&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss müssen wir unsere erstellten Gruppen noch dem Layout mit folgenden Methoden zuweisen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setVerticalGroup(verticalGroup);&lt;br /&gt;
layout.setHorizontalGroup(horizontalGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt noch panel in einen JFrame packen und fertig, unser erstes GroupLayout läuft! &lt;br /&gt;
&lt;br /&gt;
[[Datei:GLTut-1-FlowLayout.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn du einen Komponenten nur zu einer Group addest, fliegt eine Exception und es wird nichts angezeigt!&lt;br /&gt;
&lt;br /&gt;
== VerticalFlowLayout ==&lt;br /&gt;
&lt;br /&gt;
Wie siehts nun mit komplexeren Masken aus? Ich hab früher versucht aus zig verschiedenen, verschachtelten Panels jeweils mit eigenen einfachen LayoutManagern eine GUI zusammenzubasteln. Der Aufwand war enorm, die Übersichtlichkeit schrecklich, es war fehleranfällig und meist kam sowieso nicht das raus was gewollt war.&lt;br /&gt;
Mit dem GroupLayout kannst du dir das Panel verschachteln sparen, du verschachtelst die Groups.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir erweitern unser VerticalFlowGroupLayout: Da soll in jede Zeile noch zusätzlich ein Textfeld und ein Button rein:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 1. Vertikale Group: ===&lt;br /&gt;
&lt;br /&gt;
Wir stellen uns wieder vor, wir blicken von oben in unser Layout rein. Jetzt gibt’s zwei Betrachtungsweisen: Haben wir 3 Zeilen hintereinander, in denen je ein Label, ein Textfeld und ein Button nebeneinander stehen oder haben wir 3 Spalten nebeneinander mit jeweils 3 Labels, Textfeldern und Buttons hintereinander?&lt;br /&gt;
Die Entscheidung bleibt dir überlassen, ich werde es hier anhand des „3 Zeilen“ Ansatzes demonstrieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
        &lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Horizontale Group ===&lt;br /&gt;
&lt;br /&gt;
Analog zur Vertikalen Group: Haben wir 3 Zeilen nebeneinander in denen Label, Textfeld und Button hintereinander stehen oder haben wir 3 Spalten hintereinander, in denen untereinander je 3 Labels, Textfelder oder Buttons stehen?&lt;br /&gt;
W man sich beim Vertikalen Teil für die Zeilen Denkweise entschieden hat, ist es mMn sinnvoll dabei zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup horizontalGroup=layout.createParallelGroup();&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In meinem StandardFrame mit fixer Größe sieht das ganze nun aber so aus:&lt;br /&gt;
&lt;br /&gt;
Die Komponenten füllen den gesamten Platz der aus – wir brauchen sowas wie einen Glue aus dem BoxLayout. Im GroupLayout heißt das Gap.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gaps und Größenangaben ==&lt;br /&gt;
&lt;br /&gt;
Erstens gibt’s da mal eine Komfortfunktion die man ich eigentlich immer aktiviert habe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setAutoCreateGaps(true);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kleben die Komponenten nicht mehr so aneinander, wie man das auch vom GridLayout her kennt.&lt;br /&gt;
&lt;br /&gt;
Zu unserm Problem, wir können Gaps genauso wie Komponenten einer Gruppe hinzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(Short.MAX_VALUE);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
addGap erwartet einen Integer Wert als Parameter, der angibt wie groß der Gap sein soll. Short.MAX_VALUE liegt bei ca. 32000, so große Displays gibt’s noch nicht.&lt;br /&gt;
&lt;br /&gt;
Man kann addGap aber auch 3 ints übergeben: addGap(int min,int pref, int max)&lt;br /&gt;
Man kann also Minimum, Preferred und Maximum Size einstellen. Das funktioniert genauso bei Komponenten:&lt;br /&gt;
&lt;br /&gt;
Ändern wir den Code auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
. addComponent(textField1,20,20,20)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird unser Textfield1 immer genau 20 Pixel hoch sein.&lt;br /&gt;
Achtung: Die Größenangaben beziehen sich immer auf die Achse, in der sie gemacht werden. Angaben in der VerticalGroup beeinflussen nur die Höhe, Angaben in der HorizontalGroup nur die Breite.&lt;br /&gt;
&lt;br /&gt;
Die Größenangaben manuell anzugeben ist allerdings kein sauberer Stil. Komponenten haben ja selber schon min, preferred und max Size Einstellungen, die werden dadurch einfach ignoriert. Um dem GroupLayout zu sagen, es soll immer auf eine dieser Methoden zurückgreifen gibt’s 2 Konstanten:&lt;br /&gt;
GroupLayout.DEFAULT_SIZE und GroupLayout.PREFERRED_SIZE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                .addComponent(button1)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Textfeld maximal die Höhe seiner PreferredSize haben.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir wollen links unten in unserem Fenster einen OK Button einfügen.&lt;br /&gt;
&lt;br /&gt;
Wir fügen einen Gap zwischen Zeile 3 und dem Ok Button ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(0,0,Short.MAX_VALUE);&lt;br /&gt;
verticalGroup.addComponent(okButton);&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addGap(0,0,Short.MAX_VALUE)&lt;br /&gt;
                .addComponent(okButton));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ein (0,0,Short.MAX_VALUE) Gap füllt soviel Platz aus, wie ihm zur Verfügung steht. Egal wie groß ihr das Fenster macht, der OK Button ist immer rechts unten.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Fortgeschrittenes: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir stellen die Font eines unserer Labels auf 80 und wollen, dass die Textfeld und Button in der Mitte der Zeile angezeigt werden. Wir setzten für unsere Textfelder unterschiedliche Preferred Sizes und wollen dass die Buttons alle schön untereinander stehen und gleich breit sein. Ausserdem soll das Layout nur so viel Platz wie nötig ausfüllen.&lt;br /&gt;
&lt;br /&gt;
Erstmal setzten wir ganz normal die Preferred Size der Textfelder und die Font des Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;Font f = new Font( &amp;quot;Arial&amp;quot;, Font.PLAIN, 80 );&lt;br /&gt;
label1.setFont(f);&lt;br /&gt;
 &lt;br /&gt;
textField1.setPreferredSize(new Dimension(70,20));&lt;br /&gt;
textField2.setPreferredSize(new Dimension(100,20));&lt;br /&gt;
textField3.setPreferredSize(new Dimension(130,20));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 1:&#039;&#039;&#039; Die Komponenten einer Zeile der Höhe nach mittig ausrichten:&lt;br /&gt;
ParallelGroups kann man beim erzeugen einen Alignment Parameter übergeben. (Alignment. LEADING, TRAILING, CENTER oder BASELINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup(Alignment.CENTER)&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
.addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 2:&#039;&#039;&#039; Quasi ein Tabstopp für die Buttons. Wir haben nicht mehr einfach 4 Zeilen, wir haben 4 Zeilen und 2 Spalten. &lt;br /&gt;
&lt;br /&gt;
Die HorizontalGroup muss deshalb verändert werden:&lt;br /&gt;
Wir stellen uns vor, wir schauen von „Westen“/Links auf unser Layout.&lt;br /&gt;
Da wir in unserem Layout 2 Spalten haben (Rote Rechtecke), die klar abgegrenzt hintereinander kommen sollen Brauchen wir erstmal eine SequentialGroup.&lt;br /&gt;
SequentialGroup horizontalGroup=layout.createSequentialGroup();&lt;br /&gt;
&lt;br /&gt;
Jetzt betrachten wir erstmal nur das linke Rechteck (um das rechte kümmern wir uns nachher).&lt;br /&gt;
3 Zeilen übereinander mit je Label und Textfeld hintereinander oder 3 Labels übereinander, danach 3 Textfelder übereinander. (Wir machens auf die Zeilen Art).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup labelTextfieldGroup=layout.createParallelGroup()&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2)&lt;br /&gt;
                .addComponent(textField2,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3)&lt;br /&gt;
                .addComponent(textField3,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch die 4 Buttons übereinander, das ist wieder einfacher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup buttonGroup=layout.createParallelGroup(Alignment.TRAILING)&lt;br /&gt;
        .addComponent(button1)&lt;br /&gt;
        .addComponent(button2)&lt;br /&gt;
        .addComponent(button3)&lt;br /&gt;
        .addComponent(okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt stöpseln wir die zwei roten Rechteck-Gruppen zusammen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;horizontalGroup.addGroup(labelTextfieldGroup).addGroup(buttonGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 3:&#039;&#039;&#039; Den Buttons die gleiche Breite verpassen.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt’s die Funktion linkSize:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.linkSize(SwingConstants.HORIZONTAL,button1,button2,button3,okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwingConstants.HORIZONTAL gibt an ob man die Breite oder die Höhe verlinken will. Danach kann man beliebig viele Komponenten hinzuschreiben (varargs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links: ==&lt;br /&gt;
&lt;br /&gt;
API-Dokumentation vom [http://docs.oracle.com/javase/7/docs/api/javax/swing/GroupLayout.html GroupLayout] &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Oracle: [http://download.oracle.com/javase/tutorial/uiswing/layout/group.html How to Use GroupLayout (The Java™ Tutorials &amp;gt; Creating a GUI With JFC/Swing &amp;gt; Laying Out Components]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer: bERt0r|bERt0r]] 04:06, 16. Dez 2011 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Swing]]&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Datei:GLTut-1-FlowLayout.png&amp;diff=5667</id>
		<title>Datei:GLTut-1-FlowLayout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Datei:GLTut-1-FlowLayout.png&amp;diff=5667"/>
		<updated>2013-09-09T13:23:06Z</updated>

		<summary type="html">&lt;p&gt;BERt0r: Eine Anordnung wie im Flowlayout mithilfe des Grouplayouts.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine Anordnung wie im Flowlayout mithilfe des Grouplayouts.&lt;/div&gt;</summary>
		<author><name>BERt0r</name></author>
	</entry>
</feed>