如果界面中有大文本框,通常将GridData指定为GridData.FILL_BOTH。 这将在窗口调整大小时改变大小。 但是,如果在同一GridLayout中有多个这样的文本框,请注意GridData的grabExcessHorizontalSpace属性。 此属性指示如果一行中所有单元格的大小(宽度/高度)不能满足父控件的要求,是否增加单元格的大小。
举个具体的例子,有两行控件。 父控件的Layout定义为newgridlayout(4,false ),有四个现有列。 第一行控件的顺序是Label0、Text1和Button2,其中Text3占两列。 第2行是Text2,独占了4列。 我想把第一行按钮的右端和第二行文本框的右端对齐。 这两个文本框都随着窗口的变宽而变宽。 代码如下。
import org.eclipse.swt.*; import org.eclipse.swt.custom.*; importorg.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; importorg.eclipse.swt.widgets.*; 公共类mylayout { publicstaticvoidmain { string [ ] args }
显示显示=new display (;
壳壳-新壳;
gridlayout gridlayout=new gridlayout (;
gridLayout.numColumns=4;
外壳. setlayout(gridlayout;
标签标签0=新标签(shell,SWT.NONE );
Label0.Settext(Label0);
texttext1=new text (shell,SWT.BORDER );
text1.settext('text1);
栅格数据=new栅格数据(;
data.horizontal alignment=griddata.fill;
data.horizontalSpan=2;
data.grabexcesshorizontalspace=true;
text1. setlayoutdata (数据;
buttonbutton2=newbutton (外壳,SWT.PUSH );
button2.settext('button2);
texttext3=new text (shell,SWT.BORDER );
text3.settext () text3);
数据=new griddata (;
data.horizontal alignment=griddata.fill;
data.vertical alignment=griddata.fill;
data.horizontalSpan=4;
data.grabexcesshorizontalspace=true; //Wrong!
text3. setlayoutdata (数据;
壳牌. pack (;
壳牌. open (; while (! shell.isDisposed () ) if (! display.readAndDispatch (
display.sleep (;
}
display.dispose (;
}
}
考虑到两个文本框的宽度变大,指定它们的GridData的grabExcessHorizontalSpace属性为true,执行结果与我们所想的不同。 这是因为下面的文本框实际上占用了第一行最两侧的两个单元格的宽度,而第一行中间的两个单元格的宽度变小了。 要解决此问题,请删除定义第二个文本框Text3的grabExcessHorizontalSpace语句。 默认值为false。
为了简单起见,还经常使用griddata data=new griddata (griddata.fill _ both )定义griddata。 此FILL_BOTH包含FILL_HORIZONTAL和FILL_BOTH,分别是HORIZONTAL_ALIGN_FILL、GRAB_HORIZONTAL、vertical _ alizontal 因此,如果在生成方法中定义的GridData中不使用grabExcessHorizontalSpace,则必须手动将其指定为false。