¡¡¡¡Ôö¼ÓһЩÄÚÈÝ¡¡¡¡ÏÖÔÚÎÒÃÇÒѾÓÐÒ»¸öviewÄܹ»³É¹¦ÔËÐÐÁË.ÎÒÃÇ¿ÉÒÔÍùÀïÃæÔö¼ÓһЩÄÚÈÝ.Eclipse formsÓÐÒ»¸öbody,ÎÒÃÇ¿ÉÒÔÕâÑù´´½¨ÄÚÈÝ.
public void createPartControl(Composite parent) {
toolkit = new FormToolkit(parent.getDisplay());
form = toolkit.createForm(parent);
form.setText("Hello, Eclipse Forms");
GridLayout layout = new GridLayout();
form.getBody().setLayout(layout);
Hyperlink link = toolkit.createHyperlink(form.getBody(),
"Click here.", SWT.WRAP);
link.addHyperlinkListener(new HyperlinkAdapter() {
public void linkActivated(HyperlinkEvent e) {
System.out.println("Link activated!");
}
});
}
¡¡¡¡formµÄbodyÊDZêÌâÏÂÃæµÄ¿ÉÓÿռ䣬ÒòΪÕâ¸ö¿Õ¼äÊÇÒ»¸öSWT Composite£¬ËüÄÜ×öΪÆäËü×é¼þµÄparent¡£ÔÚÉÏÃæµÄ´úÂëÀÎÒÃÇΪbodyÉèÖÃÁËlayout£¬È»ºó´´½¨ÁËÒ»¸ö³¬Á´½Ó¡£³¬Á´½ÓÊÇÓÉEclipse FormsÌṩµÄΪÊý²»¶àµÄ×é¼þÖ®Ò»£¬ÎÒÃÇ¿ÉÒÔΪ³¬Á´½ÓÔö¼Ó¼àÌýÆ÷£¬ÕâÑùÄܹ»ÔÚÓû§µã»÷Ëüʱ×ö³ö·´Ó¦¡£
¡¡¡¡Éý¼¶ºóµÄÊÓͼӦ¸Ã¿´ÆðÀ´ÏóÕâÑù£º
ͼ3£ºÒ»¸öÓг¬Á´½ÓµÄ¼òµ¥form.
¡¡¡¡³¬Á´½Ó×é(Hyperlink Groups)
¡¡¡¡Form tookitÓÐÒ»¸ö"³¬Á´½Ó×é"¶ÔÏó.ÿ¸ö´´½¨³öµÄ³¬Á´½Ó¶¼¼ÓÈëÕâ¸ö×é¶ÔÏóÖÐ.³¬Á´½ÓΪ¶à¸ö½ÇÉ«·þÎñ.ËüÃǶ¨ÒåÁËÕâ¸ö×éÖÐËùÓг¬Á´½ÓÔÚÕý³£¡¢hover¡¢¼¤»î²»Í¬×´Ì¬ÏµÄÑÕÉ«.ËüÃǸù¾ÝС×éÖÐÁ´½Ó²»Í¬µÄ״̬À´¸Ä±äÑÕÉ«.ËüÃǸù¾ÝС×éÖÐÁ´½Ó²»Í¬µÄ״̬À´¸Ä±äÏ»®Ïß·ç¸ñ.
¡¡¡¡µ±ÄãÒª¸Ä±ä³¬Á´½Ó×é¶ÔÏóµÄĬÈÏÉèÖÃʱ,¿ÉÒÔͨ¹ýtoolkitµÄgetHyperlinkGroup()·½·¨À´»ñµÃ³¬Á´½Ó×é¶ÔÏó.
¡¡¡¡´´½¨ÆÕͨ×é¼þ¡¡¡¡Eclipse FormsµÄÒ»¸öÉè¼ÆÄ¿±ê¾ÍÊÇÈÃÄܹ»ÔÚ±à¼Æ÷/ÊÓͼÖд´½¨ÆÕͨSWT×é¼þ.ÒòΪformµÄbodyÊÇÒ»¸öÆÕͨcomposite,ÄãÄܹ»ÔÚËüÀïÃæÊ¹ÓÃÈκÎlayoutºÍ×é¼þ.µ«ÊÇ,¼Çס"ÔÉúµÄ"SWT×é¼þÓÐÒ»¸ö×é¼þ±³¾°.ÎÒÃÇÏÖÔÚͨ¹ýËüÃǵĹ¹Ôì·½·¨´´½¨Ò»Ð©×é¼þ.
layout.numColumns = 2;
GridData gd = new GridData();
gd.horizontalSpan = 2;
link.setLayoutData(gd);
Label label = new Label(form.getBody(), SWT.NULL);
label.setText("Text field label:");
Text text = new Text(form.getBody(), SWT.BORDER);
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Button button = new Button(form.getBody(), SWT.CHECK);
button.setText("An example of a checkbox in a form");
gd = new GridData();
gd.horizontalSpan = 2;
button.setLayoutData(gd);
¡¡¡¡ÏÖÔÚÎÒÃÇʹÓÃÁËÁ½ÁÐ,²¢ÇÒ´´½¨ÁËÒ»¸ö±êÇ©(label),Ò»¸öÎı¾¿ò(text field)ºÍÒ»¸ö¸´Ñ¡¿ò(checkbox).½á¹ûÈçÏ£º
ͼ4£ºÒ»¸öÓµÓÐÖ±½ÓÓÃËüÃǵĹ¹ÔìÆ÷´´½¨³öµÄSWT×é¼þµÄform
¡¡¡¡ÕâÕÅͼƬÔõô»ØÊ£¿ÎÒÃÇ´´½¨µÄ×é¼þµÄ±³¾°Ö±½ÓºÍϵͳ´°¿Ú±³¾°ÏàÆ¥Åä,¶ø²»ÊǺÍformµÄ±³¾°Æ¥Åä.ÁíÍâ,Îı¾¿ò¿´ÆðÀ´»¹ºÃÊÇÒòΪÕâÕŽØÍ¼ÊÇÔÚWindows XPϽصÄ.ÔÚÆäËü²Ù×÷ϵͳÉÏ,Ëü»á¿´ÆðÀ´ÊÇÓÐÒ»¸ö3D±ß¿òµÄ¿Õ°×Ìõ.ΪÁ˽â¾öÕâ¸öÎÊÌâ,ÎÒÃÇ»áÓÃtoolkitµÄ¹¤³§·½·¨À´´´½¨ÕâЩ×é¼þ£º
Label label = toolkit.createLabel(form.getBody(), "Text field label:");
Text text = toolkit.createText(form.getBody(), "");
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Button button = toolkit.createButton(form.getBody(), "A checkbox in a form", SWT.CHECK);
gd = new GridData();
gd.horizontalSpan = 2;
button.setLayoutData(gd);
¡¡¡¡Õâ¸öÊÓͼÏÖÔڻῴÀ´¸üºÃЩÁË£º
ͼ5£ºÒ»¸öÓµÓÐÓÃform toolkitµÄ¹¤³§·½·¨´´½¨³öµÄSWT×é¼þµÄform
¡¡¡¡ÓÉform toolkitÌṩµÄ¹¤³§·½·¨ÊÇΪÁË·½±ã¡£ToolkitûÓк¯¸ÇËùÓÐÇé¿ö£¬ÉõÖÁÊÇSWT×é¼þ¼¯ºÏ,¶øÇÒÃ÷ÏÔûÓÐΪÄã¿ÉÄÜÓеÄ×Ô¼º¶¨ÖƵÄ×é¼þÌṩÕâÒ»±ãÀû.µ±ÄãÐèҪʹһ¸öSWT×é¼þÓëformͳһʱ,ÄãÓ¦¸ÃʹÓÃÒ»¸ö·½·¨:FormToolkit.adapt(Control control, boolean trackFocus£¬boolean trackKeyboard).ËùÓеŤ³§·½·¨¸÷×Ô·Ö±ðµ÷ÓÃÁËÕâ¸öÊÊÅä·½·¨¡£
¡¡¡¡´ïµ½"ƽ»¬"µÄÊÓ¾õЧ¹û ¡¡¡¡Ò»¸öÔÚPDE±à¼Æ÷ÖÐEclipse FormsµÄ¿É¿´³öµÄÊôÐÔÊÇ×é¼þµÄ"ƽ»¬"ÊÓ¾õЧ¹û.ÒÔǰËùÓÐûÓÐ3D±ß¿òµÄ×é¼þÔÚ´°¿ÚÖп´ÆðÀ´²»´í,µ«ÊÇÔÚ±à¼Æ÷»òÊÓͼÖоͲ»ÐÐ.Õâ¸öÖ§³ÖдÔÚFormToolkitÀàÖÐ.µ«ÊÇ,ÔÚһЩϵͳÉÏËüÊÇͨ¹ýһЩ¶¨ÖÆ´ïµ½µÄ.¾Ù¸öÀý×Ó,¿´Ò»ÏÂÕâÕÅ´ÓPDE±à¼Æ÷(2.1°æ±¾)ÖеĽØÍ¼£º
ͼƬ6£ºEclipse 2.1ÖÐEclipse FormsµÄƽ»¬ÊÓ¾õЧ¹û.
¡¡¡¡Ïó±í¸ñ,Îı¾Àà,¸´Ñ¡¿òµÈ,ÊǼÓÉÏÒ»¸öƽ»¬µÄ1¸öÏóËØ¿íµÄ±ß¿ò.ÕâЩ±ß¿ò²»ÊÇÀ´×Ô×é¼þ×Ô¼º(SWT.BORDER·ç¸ñûÓÐÓõ½).ÁíÍâ,Èç¹ûÉèÖÃÒ»ÏÂ,tookit»áΪÿ¸ö×é¼þµÄparentÔö¼ÓÒ»¸öpaint¼àÌýÆ÷,ÔÚpaintʼþ·¢ÉúʱΪ×é¼þ¼ÓÉϱ߿ò.ÒªÏëÕâÑùµÄ»°,ÄãÐèҪΪÄã´´½¨µÄÏóÎı¾,±í¸ñ,Ê÷µÈ×é¼þµÄÿ¸öcompositeµ÷ÓÃpaintBordersFor(parent).ÿ¸öparentÖ»ÐèÒªµ÷ÓÃÒ»´Î·½·¨¾Í×ã¹»ÁË£º²»ÐèҪΪÿ¸ö×é¼þÕâÑùµ÷ÓÃ.
¡¡¡¡Form toolkitÖªµÀÄĸö×é¼þÐèÒªÒ»¸ö¶¨ÖƵı߿ò.µ«ÊÇ,Äã¿ÉÄÜд´½¨ÁËÒ»¸ö²»ÔÚÔÀ´Ãûµ¥ÖеÄ×é¼þ,ËüÒ²ÐèÒªÒ»¸ö±ß¿ò.Äã¿ÉÒÔͨ¹ýÏóÏÂÃæÕâÑùµÄ´úÂë¸øtoolkitÒ»¸öÌáʾ£º
Control myControl = new MyControl(parent);
myControl.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
// or myControl.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TREE_BORDER);
toolkit.paintBordersFor(parent);
¡¡¡¡Äã¿ÉÒÔÔÚÉÏÃæÕâÕÅͼÖп´³ö,ÏóÊ÷ºÍ±í¸ñÕâÑùµÄ"½á¹¹»¯(structural)"µÄ×é¼þÓкÍÎı¾ÇøÓò²»Í¬µÄ±ß¿ò·ç¸ñ²¢ÇÒÄã¿ÉÒÔÑ¡ÔñºÍÄãµÄ×é¼þÏà·ûºÏµÄÄǸö.×¢ÒâÓÃtoolkitµÄ¹¤³§·½·¨´´½¨³öµÄ×é¼þ²»ÐèÒªÕâÑù×ö.
¡¡¡¡ÒòΪEclipse 3.0ºÍÔÚWindows XPÉÏ,µ±javaw.exe.manifestÎļþÔÚJavaÐéÄâ»úbinÎļþ¼ÐÖÐʱ,ûÓб߿ò²úÉú³öÀ´.(ÕâÆªÎÄÕÂÀïÎÒËùÓнØÍ¼¶¼ÊÇÔÚWindows XPϽصÄ).Õâ¸öÎļþ--Äã¿ÉÒÔÔÚ SWT home pageÉÏÏÂÔØ--¸æËßtoolkitΪ±¾µØ×é¼þʹÓÃXPƤ·ô.ÓÃXPƤ·ô,ÏóÎı¾,±í¸ñºÍÊ÷ÊÇÒѾƽ»¬µÄ²¢ÇÒ²»ÐèÒªÔÙÈ¥µ÷Õû.ΪÁËÈÃÄãµÄ´úÂëÓµÓпÉÒÆÖ²ÐÔ,Äã¿ÉÒÔ×ÜÊǵ÷ÓÃpaintBordersFor(Composite)·½·¨,ÈÃtoolkitÈ¥¸ù¾Ý²»Í¬²Ù×÷ϵͳÀ´¾ö¶¨¸ÃÔõô×ö¡£
¡¡¡¡¶¨ÖƲ¼¾Ö(Custom layouts)¡¡¡¡Eclipse FormsÔÚSWT layoutµÄ»ù´¡ÉÏÔö¼ÓÁËÁ½¸öеÄlayout£¬ÕâЩlayout¼Ì³ÐÁËSWT Layout»ùÀಢÄܹ»ÔÚÈκÎSWT compositeÉÏʹÓ㬵«ÊÇÒ»°ã¶¼ÊǺÍEclipse FormsÁªºÏʹÓõġ£
¡¡¡¡TableWrapLayout¡¡¡¡ÏÖÔÚÎÒÃÇÖªµÀÈçºÎÀ´×éºÏÒ»¸öform,ÈÃÎÒÃÇÏȸøÒ»¸öÐüÄî.ÎÒÃÇ»á¸Ä±äÄǸö³¬Á´½ÓÎı¾Ê¹Ëü¼Ó³¤Ò»Ð©£º
link.setText("This is an example of a form that is much longer "+
"and will need to wrap.");
¡¡¡¡ÈÃÎÒÃÇ¿´¿´½á¹û£º
ͼƬ7£ºÒ»¸öʹÓÃGridLayoutµÄform
¡¡¡¡·¢ÉúʲôÊÂÁË£¿¼ÇסÎÒÃÇʹÓõÄÊÇGridLayout£¬µ±ËüÎÊÕâ¸ö³¬Á´½Ó×é¼þÀ´¼ÆËãËü´óСʱ£¬³¬Á´½Ó¸æËßËüÎÄ×ÖÔÚµ¥¶ÀÐÐÀïÐèÒªµÄ³¤¶È£¬ËäÈ»ÎÒÃǸæËß×é¼þÈ¥°ü¹ü(wrap)£¬Ëü²¢Ã»ÓÐÕâÑù×öÒòΪGridLayoutÐèÒª×é¼þ·µ»ØËüµÄ³¤¶È¡£³¬Á¬½Ó×é¼þ--ºÍÆäËüÏóLabelÒ»ÑùµÄSWT×é¼þ£¬¿ÉÒÔͨ¹ýÄã´«µÝËüÊýÖµÀ´¾ö¶¨³¤ºÍ¿í,µ«ÊÇGridLayout²»»áÏò×é¼þ´«µÝÊýÖµ²ÎÊý¡£
¡¡¡¡ÎÒÃÇÐèÒªµÄÊÇÒ»¸öÏóHTML±í¸ñÒ»ÑùµÄlayout.ÎÒÃÇÏ£ÍûÄÚÈÝÈ¥ÊÔͼÅäºÏÌṩµÄ¿Í»§¿Õ¼ä,²¢ÇÒÒ»ÐÐÐеصþ¼Ó.Eclipse FormsÌṩÁËÒ»¸öÕâÑùµÄlayout½ÐTableWrapLayout.GridLayoutºÍTableWrapLayoutÖ®¼äÓÐÐí¶à¹²Í¬µã.¶¼ÊÇÓñí¸ñÀ´×éÖ¯parentµÄchildren.¶¼ÓÐlayout dataÀ´¸æËßlayoutÈçºÎ¶Ô´ýÿ¸ö×é¼þ.¶¼Äܹ»ÔÚÐèÒªÕ¼¾ÝËùÓпռäʱµÈ½ÓÊÜ×é¼þµÄÌáʾ.
¡¡¡¡µ«ÊÇ,ËüÃÇÔÚ²¼¾ÖʱÍêÈ«²»Í¬.TableWrapLayout´ÓÁпªÊ¼.Ëü¼ÆËãÿÁеÄ×îСµÄ,ºÏÊʵÄ,×î´óµÄ¿í¶È²¢ÓÃÕâ¸öÐÅÏ¢À´Õ¼¾Ý¿Õ¼ä.ËüÒ²ÊÔͼ¾¡¿ÉÄܵع«Æ½µØÔÚ¸÷Áмä·Ö¸ô,ÕâÑùÓÐЩ×é¼þ¾ÍûÓжàÓàµÄ¿Õ¼ä.
¡¡¡¡ÈÃÎÒÃÇʹÓÃTableWrapLayoutÀ´ÖØÐ¸ü¸ÄÀý×Ó(¸ü¸Ä´¦¸ßÁ
ÁÏÔʾ)£º
public void createPartControl(Composite parent) {
toolkit = new FormToolkit(parent.getDisplay());
form = toolkit.createForm(parent);
form.setText("Hello, Eclipse Forms");
TableWrapLayout layout = new TableWrapLayout();
form.getBody().setLayout(layout);
Hyperlink link = toolkit.createHyperlink(form.getBody(),"Click here.", SWT.WRAP);
link.addHyperlinkListener(new HyperlinkAdapter() {
public void linkActivated(HyperlinkEvent e) {
System.out.println("Link activated!");
}
});
link.setText("This is an example of a form that is much longer and will need to wrap.");
layout.numColumns = 2;
TableWrapData td = new TableWrapData();
td.colspan = 2;
link.setLayoutData(td);
Label label = toolkit.createLabel(form.getBody(), "Text field label:");
Text text = toolkit.createText(form.getBody(), "");
td = new TableWrapData(TableWrapData.FILL_GRAB);
text.setLayoutData(td);
Button button = toolkit.createButton(form.getBody(), "A checkbox in a form",
D(["mb","SWT.CHECK);\n td \u003d new TableWrapData();\n td.colspan \u003d 2;\n button.setLayoutData(td);\n }
ÎÒÃÇÓÃÁËGridDataÏàͬµÄ¸ÅÄî.һЩ±äÁ¿ÓµÓв»Í¬µÄÃû×Ö(¾Ù¸öÀý×Ó,colspanºÍrowspan,alignºÍvalignÈ¡×ÔHTML TABLEµÄÊôÐÔ),µ«ÊÇÄã¿ÉÒÔ×öÏàͬµÄÊÂ--´´½¨Ò»¸ö³¬Á´½ÓºÍ°´Å¥Õ¼¾ÝÁ½Áеĸñ×Ó.ÒòΪ¿Õ°×(margins)ºÍGridLayoutÊÇÏàͬµÄ,½á¹û»á¿´ÆðÀ´Ò»Ñù,³ýÁ˳¬Á´½ÓÏÖÔÚ»á°ü¹üÆðÀ´£º
\n
ͼƬ8£ºÒ»¸öʹÓÃTableWrapLayoutµÄform
\n
TableWrapLayoutºÍGridLayoutµÄÒ»¸öÖ÷Òª
µÄ²»Í¬µãÊÇÄãÓ¦¸Ãֹͣȥ¼ÆËã´¹Ö±µÄ¿Õ¼ä.ÔÚGridLayoutÀï,ÄãÒ»°ã»áÈÃ"²»Ò×±äÐεÄ(rigid)"×é¼þÓÃ×ÔÈ»µÄλÖúʹóС²¢ÈÃ"¿ÉÉìËõµÄ(flexible)"×é¼þÈ¥Õ¼¾Ýˮƽ»ò´¹Ö±µÄ¿Õ¼ä.Ïà·´,TableWrapLayoutÊÇ´ÓÉÏÍùϹ¤×÷µÄ,²¢ÇÒËüÈÝÏÂËùÓеÄ×é¼þ,ËüµÄ¹¤×÷ÊÇÍêÈ«µÄ.Õ¼¾Ýˮƽ¿Õ¼äµÄ¸ÅÄ´æÔÚ(ÏóÉÏÃæÕ¹Ê¾Ò»Ñù).µ«ÊÇ,´¹Ö±·½ÏòÉÏ,ÄãÖ»ÄÜÔÚµ¥Ôª(cell)±È×é¼þ¸ßʱѡÔñFILLµ¥Ôª,»òÑ¡ÔñTOP,MIDDLE»òBOTTOM´¹Ö±¶ÔÆë.\n
ÄãÒ²Ðí»á×¢Òâµ½Ò»¸öµØ·½ºÍ¸Õ¸Õ˵µÄ²»·û£ºTableWrapLayoutÈÔÈ»ÓÐÒ»¸ögrabVertical±äÁ¿.µ«ÊÇ,ÕâÀïÕâ¸ö±äÁ¿ÔÚÕâÀïÓÐÃ÷È·µÄÄ¿µÄ£ºµ±Ò»¸öÉèÖÃÁ˸߶ȵÄ×é¼þÕ¼¶àÐÐʱ,ËüµÄ¸ß¶È»á¸ø³öÒ»¸öÌõ¼þ¾ÍÊÇ´¹Ö±dimensionÒѾ֪µÀÁË,×é¼þÐèҪȥ³ýËüËùÔڵĶà¸öµ¥ÔªÖ®¼äµÄ¶àÓà¿Õ¼ä.
\n
ΪÁËÓÃTableWrapLayoutÓкõĽá¹û,È·¶¨×é¼þ¿ÉÒÔ½Ó½ü·ç¸ñ(SWT.WRAP).Eclipse FromsÌṩµÄ×éºÏ¶¨ÖÆ×é¼þÄܹ»ÔÚboxÍâÃæ°ü¹ü.ÕâÊÇͨ¹ýʵÏÖILayoutExtension½Ó¿ÚʵÏֵģº
public interface ILayoutExtension {
/**
* Computes the minimum width of the parent. All widgets capable of word\n
* wrapping should return the width of the longest word that cannot be
* broken any further.
*
* @param parent the parent composite
* @param changed true
if the cached information should be\n
* flushed, false
otherwise.
* @return the minimum width of the parent composite
*/
public int computeMinimumWidth(Composite parent, boolean changed);
\n
/**
* Computes the maximum width of the parent. All widgets capable of word
* wrapping should return
the length of the entire text with wrapping
* turned off.
*
* @param parent the parent composite\n
* @param changed true
if the cached information
* should be flushed, false
otherwise.",1]
);
//SWT.CHECK);
td = new TableWrapData();
td.colspan = 2;
button.setLayoutData(td);
}¡¡¡¡ÎÒÃÇÓÃÁËGridDataÏàͬµÄ¸ÅÄî.һЩ±äÁ¿ÓµÓв»Í¬µÄÃû×Ö(¾Ù¸öÀý×Ó,colspanºÍrowspan,alignºÍvalignÈ¡×ÔHTML TABLEµÄÊôÐÔ),µ«ÊÇÄã¿ÉÒÔ×öÏàͬµÄÊÂ--´´½¨Ò»¸ö³¬Á´½ÓºÍ°´Å¥Õ¼¾ÝÁ½Áеĸñ×Ó.ÒòΪ¿Õ°×(margins)ºÍGridLayoutÊÇÏàͬµÄ,½á¹û»á¿´ÆðÀ´Ò»Ñù,³ýÁ˳¬Á´½ÓÏÖÔÚ»á°ü¹üÆðÀ´£º
ͼƬ8£ºÒ»¸öʹÓÃTableWrapLayoutµÄform
¡¡¡¡TableWrapLayoutºÍGridLayoutµÄÒ»¸öÖ÷ÒªµÄ²»Í¬µãÊÇÄãÓ¦¸Ãֹͣȥ¼ÆËã´¹Ö±µÄ¿Õ¼ä.ÔÚGridLayoutÀï,ÄãÒ»°ã»áÈÃ"²»Ò×±äÐεÄ(rigid)"×é¼þÓÃ×ÔÈ»µÄλÖúʹóС²¢ÈÃ"¿ÉÉìËõµÄ(flexible)"×é¼þÈ¥Õ¼¾Ýˮƽ»ò´¹Ö±µÄ¿Õ¼ä.Ïà·´,TableWrapLayoutÊÇ´ÓÉÏÍùϹ¤×÷µÄ,²¢ÇÒËüÈÝÏÂËùÓеÄ×é¼þ,ËüµÄ¹¤×÷ÊÇÍêÈ«µÄ.Õ¼¾Ýˮƽ¿Õ¼äµÄ¸ÅÄ´æÔÚ(ÏóÉÏÃæÕ¹Ê¾Ò»Ñù).µ«ÊÇ,´¹Ö±·½ÏòÉÏ,ÄãÖ»ÄÜÔÚµ¥Ôª(cell)±È×é¼þ¸ßʱѡÔñFILLµ¥Ôª,»òÑ¡ÔñTOP,MIDDLE»òBOTTOM´¹Ö±¶ÔÆë.
¡¡¡¡ÄãÒ²Ðí»á×¢Òâµ½Ò»¸öµØ·½ºÍ¸Õ¸Õ˵µÄ²»·û£ºTableWrapLayoutÈÔÈ»ÓÐÒ»¸ögrabVertical±äÁ¿.µ«ÊÇ,ÕâÀïÕâ¸ö±äÁ¿ÔÚÕâÀïÓÐÃ÷È·µÄÄ¿µÄ£ºµ±Ò»¸öÉèÖÃÁ˸߶ȵÄ×é¼þÕ¼¶àÐÐʱ,ËüµÄ¸ß¶È»á¸ø³öÒ»¸öÌõ¼þ¾ÍÊÇ´¹Ö±dimensionÒѾ֪µÀÁË,×é¼þÐèҪȥ³ýËüËùÔڵĶà¸öµ¥ÔªÖ®¼äµÄ¶àÓà¿Õ¼ä.
¡¡¡¡ÎªÁËÓÃTableWrapLayoutÓкõĽá¹û,È·¶¨×é¼þ¿ÉÒÔ½Ó½ü·ç¸ñ(SWT.WRAP).Eclipse FromsÌṩµÄ×éºÏ¶¨ÖÆ×é¼þÄܹ»ÔÚboxÍâÃæ°ü¹ü.ÕâÊÇͨ¹ýʵÏÖILayoutExtension½Ó¿ÚʵÏֵģº
public interface ILayoutExtension {
/**
* Computes the minimum width of the parent. All widgets capable of word
* wrapping should return the width of the longest word that cannot be
* broken any further.
*
* @param parent the parent composite
* @param changed true
if the cached information should be
* flushed, false
otherwise.
* @return the minimum width of the parent composite
*/
public int computeMinimumWidth(Composite parent, boolean changed);
/**
* Computes the maximum width of the parent. All widgets capable of word
* wrapping should return the length of the entire text with wrapping
* turned off.
*
* @param parent the parent composite
* @param changed true
if the cached information
* should be flushed, false
otherwise.
* @return the maximum width of the parent composite
*/
public int computeMaximumWidth(Composite parent, boolean changed);
}
¡¡¡¡TableWrapLayout±¾ÉíʵÏÖÁËÕâ¸ö½Ó¿Ú,ÕâÑùÈÃËü´¦Àíµ±compositesµÄlayoutÊÇÕâ¸öcompositeµÄparentµ
ÄchildrenµÄÇé¿ö.ÁíÍâµÄÁ½¸ö·½·¨Äܹ»¼ÆËãÁ½ÖÖ¼«¶ËÇé¿ö--µ±ËùÓÐ×é¼þ¾¡¿ÉÄÜ¿íµØ²¼ÂúʱµÄÏÔÈ»µÄ×îС¿í¶ÈºÍ×î´ó¿í¶È.Á½ÕߵIJ»Í¬ÊÇʹÁÐÖ®¼äµÄ¶àÓà¿Õ¼ä¾¡¿ÉÄÜСʱ¹±Ï׳ö¹«Æ½µÄ¿Õ¼ä.
¡¡¡¡ÈÃÎÒÃÇ¿´Çå³þ¹±Ï׿ռäÊÇÔõÑùµÄ.ÎÒÃÇ»áÍÆ¼öÎÒÃǵ½ÏÖÔÚΪֹдµÄ´úÂë²¢ÏóÏÂÃæÕâÑù×ö³öÐ޸ģº
layout.numColumns = 3;
Label label;
TableWrapData td;
label = toolkit.createLabel(form.getBody(),
"Some text to put in the first column", SWT.WRAP);
label = toolkit.createLabel(form.getBody(),
"Some text to put in the second column and make it a bit "+
"longer so that we can see what happens with column "+
distribution. This text must be the longest so that it can "+
"get more space allocated to the columns it belongs to.",
SWT.WRAP);
td = new TableWrapData();
td.colspan = 2;
label.setLayoutData(td);
label = toolkit.createLabel(form.getBody(),
"This text will span two rows and should not grow the column.",
SWT.WRAP);
td = new TableWrapData();
td.rowspan = 2;
label.setLayoutData(td);
label = toolkit.createLabel(form.getBody(),
"This text goes into column 2 and consumes only one cell",
SWT.WRAP);
label.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
label = toolkit.createLabel(form.getBody(),
"This text goes into column 3 and consumes only one cell too",
SWT.WRAP);
label.setLayoutData(new TableWrapData(TableWrapData.FILL));
label = toolkit.createLabel(form.getBody(),
"This text goes into column 2 and consumes only one cell",
SWT.WRAP);
label.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
label = toolkit.createLabel(form.getBody(),
"This text goes into column 3 and consumes only one cell too",
SWT.WRAP);
label.setLayoutData(new TableWrapData(TableWrapData.FILL));
form.getBody().setBackground(form.getBody().getDisplay().
getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
¡¡¡¡Õâ¸ö´´½¨ÁËһЩÓв»Í¬³¤¶ÈÎı¾µÄlabel.ÓÐЩlabelsÕ¼¾Ý¶àÁÐ,ÓÐЩռ¾Ý¶àÐÐ.ΪÁËÈòâÊÔ¸ü¼Ó¼òµ¥£¬ÎÒÃǰÑformµÄ±³¾°ÉèÖÃΪ×é¼þ±³¾°,ÕâÑùµ¥ÔªÄܹ»¸ü¼òµ¥¿´³öÀ´.µ±ÎÒÃÇÔËÐÐÀý×Ó,ÎÒÃÇ»áµÃµ½ÏÂÃæµÄÑù×Ó£º
ͼƬ9£ºTableWrapLayoutÁôϵĶàÓà¿Õ¼ä
¡¡¡¡¹Ø¼üÖ®´¦ÔÚÓÚ×é¼þ×îС¿í¶ÈºÍ×î´ó¿í¶ÈÏà±È½Ïʱ.Ïà²îÔ½¶à,½á¹ûÔ½Ã÷ÏÔ,»á¿´µ½ÁÐÖÐÓкܴóµÄ·ì϶.Õ¼¾ÝµÄ¿í¶ÈÊÇ×é¼þËùÐèÒªµÄ×îСµÄ¿í¶È.×¢ÒâµÚ3ÁбȵÚ2ÁÐÉÔ΢¿íÒ»µãµã,ÕâÊÇÒòΪµÚ3ÁÐÖеÄÎÄ×Ö³¤¶È±ÈµÚ2ÁÐÖÐÎÄ×ÖÒª³¤µã.Èç¹ûÐèÒªÔĶÁ²¼¾ÖµÄÏà¹ØÀíÂÛ,¿ÉÒÔÈ¥ÕâÀïW3C recommendations for HTML table auto-layout.
¡¡¡¡ColumnLayout
¡¡¡¡Eclipse FormsÁíÍâÒ»¸ö¶¨ÖƵÄlayoutÊÇSWT RowLayoutµÄ±äÖÖ.Èç¹ûÎÒÃǰÑRowLayoutÉϵÄchildren´¹Ö±·ÅÖÃʱ--°´ÁÐ-²¢ÇÒʹͬÁÐÖеÄËùÓÐ×é¼þÓµÓÐÏàͬµÄ¿í¶È,ÎÒÃÇ»áÓÉ×é¼þµÄ¿í¶ÈµÃµ½¶à¸öÁÐ.µ«ÊÇ,×îºóÒ»ÁÐÏÔÈ»²»ÊDZ»ÌîÂúµÄ--ÕâÓÉ×é¼þµÄ¸öÊý¾ö¶¨.Èç¹ûÔÚformÖÐ,ÎÒÃÇ»áÈÔÈ»¿´µ½ËùÓÐ×é¼þÔÚÒ»ÁÐÖÐ,ÒòΪRowLayout²»Äܹ»"´¹Ö±" °ü¹ü.Èç¹ûÎÒÃÇÓÃGridLayoutÏàÌæ´úµÄ»°,ÁеÄÊýÁ¿ÓÉÎÒÃÇ×Ô¼º¾ö¶¨.
¡¡¡¡ÔÚ¸ü¼Ó¸´ÔÓµÄformsÖÐÎÒÃÇÐèÒªÁеÄÊýÁ¿°´Çé¿ö±ä»¯.»»¾ä»°À´Ëµ,ÎÒÃÇÏ£ÍûÊý×Ö°´ÕÕformµÄ¿í¶ÈÀ´¸Ä±ä--ÓпÉÄÜÐèÒª¸ü¶àµÄÁÐ,µ±¿í¶È¼õСʱÔò°ÑÊý×Ö¼õС.¶øÇÒÎÒÃÇÏ£ÍûËùÓÐÁеij¤¶ÈÏó±¨Ö½²¼¾ÖÒ»ÑùÏàͬ.ÕâЩҪÇó¶¼Äܹ»Í¨¹ýColumnLayoutÀ´´ïµ½.
¡¡¡¡ÓëTableWrapLayoutÏà±È,ColumnLayout¸ü¼Ó¼òµ¥.²»ÐèÒª¸´ÔÓµÄÉèÖÃ.ΨһÐèÒªÄãÉèÖõľÍÊÇÁÐÊýµÄ·¶Î§,ĬÈÏÊÇ1µ½3.ÏÂÃæµÄÀý×ÓÑÝʾÁËÒ»¸öʹÓÃColumnLayoutµÄÓÐÐí¶à¶ÎÂä(sections)µÄform.³õʼʱ,Ö»ÐèÒªÁ½ÁоͿÉÒÔ·ÅÖÃËùÓжÎÂäÁË.Èç¹ûÎÒÃÇ°Ñ±à¼Æ÷±äÕÒ»µã,layout»áʹËüÃÇÔÚͬһÁÐÖÐ.
ͼƬ10£ºÊ¹ÓÃColumnLayoutµÄËùÓа´ÁÐÅÅÁеĶÎÂä.layout¿ªÊ¼ÊÇÁ½ÁÐ,µ«Êǰ´ÕÕ¿Õ¼äµÄ¸Ä±ä±ä³ÉÁËÒ»ÁÐ.