Der einfachste Layoutmanager ist der Flowlayout Manager. Er kann den Behälterelementen (Frame, Panel, Dialog, Window) mit der Funktion:
j_flowlayout(frame,J_HORIZONTAL);
zugeordnet werden. Das folgende Beispiel ordnet vier Objekte in einen Frame ein, und verwendet dazu den Flowlayoutmanager:
/* Example flowsimple.c */ : frame = j_frame("Simple FlowLayout Demo"); j_flowlayout(frame,J_HORIZONTAL); button1 = j_button(frame,"button1"); button2 = j_button(frame,"button2"); button3 = j_button(frame,"button3"); button4 = j_button(frame,"button4"); j_sethgap(frame,20); j_setvgap(frame,20); j_setsize(button1,200,200); j_setsize(button2,200,200); j_pack(frame); j_show(frame); while(j_nextaction()!=frame) {} :
|
Die (fast) leere Eventloop soll uns nicht weiter stören, da das Beipiel lediglich die Funktionen des Flowlayoutmanager demonstrieren soll. Die Funktionsweise kann auch nur vollständig erfaßt werden, wenn man das Beipiel ausprobiert, und die Fentergröße verändert. Dabei stellt man fest, das der Layoutmanager die Objekte bei Bedarf umgruppiert.
Ein Flowlayout Manager verfolgt die Stategie, alle Objekte nebeneinander möglichst platzsparend anzuordnen. So erscheint das Beispiel mit der Abbildung 3.3 nach dem Starten der Applikation. Man erkennt daß alle Objekte in Ihere minimalen Größe adrgestellt werden, und nebeneinander angeordnet werden. Die minimale Größe eines Objekt berechnet sich aus einer zugeordneten Größe wie die beiden ersten Button, oder aus dem Inhalt, bei Button 3 und 4 eben aus der Beschriftung.
Die Funktion
j_pack(frame);
weist einen Layoutmanager an, die Größe der enthaltenen Objekte zu bestimmen, und einen neuen Layoutplan zu entwerfen. Diese Anweisung führt häufig dazu, das das Fenster in seiner Größe verändert wird, und nur noch den minimalen Platzbedarf einnimmt, der durch die enthaltenen Objekte vorgegeben ist.
Weiterhin erkennt man, daß die Objekte einen gewissen Abstand zueinander besitzen. dieser Abstand kann horizontal und vertikal getrennt eingestellt werden:
j_sethgap(frame,20); j_setvgap(frame,20);
Der Defaultabstand der Objekte zueinander beträgt 10 Pixel. Wird das Fenster nun breiter gezogen, so werden alle Objekte defaultmäßig mittig zentriert. Wünscht man eine andere Ausrichtung, so kann dies mit der Anweisung:
j_setalignment(frame,J_RIGHT);
eingestellt werden. Gültige Ausrichtungen sind J_RIGHT, J_CENTER, J_LEFT, J_TOP, J_BOTTOM, J_TOPLEFT, J_TOPRIGHT, J_BOTTOMLEFT und J_BOTTOMRIGHT. Wird, wie im Beispiel, keine solche Anweisung gegeben, startet der Flowlayoutmanager mit seiner Defaulteinstellung. Diese ist bei einer horizontalen Ausrichtung J_TOPCENTER, und bei einer vertikalen Ausrichtung J_LEFT;
Wird nun das Fenter verkleinert, so verschwinden zunächst die rechten Buttons. Ein Manager kann nicht zaubern. Ist der Platzbedarf zu groß, so können einige Objekte eben nicht dargestellt werden. Anders verhält es sich jedoch, wenn des Beipielfenster zwar schmaler gemacht wird, jedoch auch höher. Dann werden die verschwundenen Button im freien Bereich wieder dargestellt.
Ein Flowlayoutmanager kennt folgende Optionen:
j_flowlayout( container , J_VERTICAL) j_flowlayout( container , J_HORIZONTAL)
j_fillflowlayout(container, J_TRUE) j_fillflowlayout(container, J_FALSE)
ereicht werden. J_TRUE schaltet den Füllmodus ein, mit J_FALSE kann die natürliche Größe der Objekte wieder eingestellt werden.
Ein umfangreiches Beispiel für einen Flowlayoutmanager ist im folgenden abgedruckt. Es beinhaltet alle oben genannten Optionen. Es beinhaltet vier Buttons, die die oben genannten Optionen anbieten. Durch Anklicken der Buttons kann umgeschaltet werden zwischen vertikaler und horizontaler Anordnung (Button ''orientation''), der Anordnung der Buttons innerhalb des Frames (Button ''alignment''), der ''Fill'' Option, und der ''Pack'' Option.
/* Example flowlayout.c */ : align = j_button(frame,"alignment"); orient = j_button(frame,"orientation"); fill = j_button(frame,"fill"); pack = j_button(frame,"pack"); : while((obj=j_nextaction())!=frame) { if(obj==align) { switch(alignment) { case(J_LEFT) : alignment = J_CENTER; break; case(J_CENTER) : alignment = J_RIGHT; break; case(J_RIGHT) : alignment = J_TOP; break; case(J_TOP) : alignment = J_BOTTOM; break; case(J_BOTTOM) : alignment = J_TOPLEFT; break; case(J_TOPLEFT) : alignment = J_TOPRIGHT; break; case(J_TOPRIGHT) : alignment = J_BOTTOMLEFT; break; case(J_BOTTOMLEFT) : alignment = J_BOTTOMRIGHT; break; case(J_BOTTOMRIGHT) : alignment = J_LEFT; break; } j_setalignment(frame,alignment); } if(obj==pack) j_pack(frame); if(obj==fill) { dofill=dofill?J_FALSE:J_TRUE; j_fillflowlayout(frame,dofill); } if(obj==orient) { orientation = (orientation==J_VERTICAL)?J_HORIZONTAL:J_VERTICAL; j_flowlayout(frame,orientation); j_setalignment(frame,alignment); j_fillflowlayout(frame,dofill); } } :
|