SWT的GridData中一个需要注意的地方

简介: 如果在界面上有一个大文本框,一般我们会指定它的GridData为GridData.FILL_BOTH,这样在窗口改变大小时它的大小会随着变化。但在同一个GridLayout里,如果有多个这样的文本框,一定要注意它们的GridData中的grabExcessHorizontalSpace属性,该属性指出当一行中所有单元格的大小(宽/高)还不足以填充父控件时,是否增大其尺寸。

如果在界面上有一个大文本框,一般我们会指定它的GridData为GridData.FILL_BOTH,这样在窗口改变大小时它的大小会随着变化。但在同一个GridLayout里,如果有多个这样的文本框,一定要注意它们的GridData中的grabExcessHorizontalSpace属性,该属性指出当一行中所有单元格的大小(宽/高)还不足以填充父控件时,是否增大其尺寸。

举一个具体的例子,有两行控件,父控件的Layout定义为new GridLayout(4,false),既有四列。第一行控件依次为Label0、Text1和Button2,其中Text3占2列;第二行为Text2,独占4列,我们希望第一行中的按钮右端和第二行中的文本框右端对齐,两个文本框都随窗口变宽而变宽,代码如下:

import org.eclipse.swt.*; 
import org.eclipse.swt.custom.*; 
import org.eclipse.swt.graphics.*; 
import org.eclipse.swt.layout.*; 
import org.eclipse.swt.widgets.*; 
 
public class MyLayout { 
    public static void main (String [] args) { 
        Display display = new Display (); 
        Shell shell = new Shell (display); 
        GridLayout gridLayout = new GridLayout (); 
        gridLayout.numColumns = 4; 
        shell.setLayout (gridLayout); 
 
        Label label0 = new Label (shell, SWT.NONE); 
        label0.setText ("label0"); 
         
        Text text1 = new Text (shell, SWT.BORDER); 
        text1.setText ("text1"); 
        GridData data = new GridData (); 
        data.horizontalAlignment = GridData.FILL; 
        data.horizontalSpan = 2; 
        data.grabExcessHorizontalSpace = true; 
        text1.setLayoutData (data); 
 
        Button button2 = new Button (shell, SWT.PUSH); 
        button2.setText ("button2"); 
         
        Text text3 = new Text (shell, SWT.BORDER); 
        text3.setText ("text3"); 
        data = new GridData (); 
        data.horizontalAlignment = GridData.FILL; 
        data.verticalAlignment = GridData.FILL; 
        data.horizontalSpan = 4; 
        data.grabExcessHorizontalSpace = true; //Wrong! 
        text3.setLayoutData (data); 
 
        shell.pack (); 
        shell.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_VERTICAL,而它们各自又包含了HORIZONTAL_ALIGN_FILL、GRAB_HORIZONTAL以及VERTICAL_ALIGN_FILL、GRAB_VERTICAL。所以,如果你是用构造方法定义的GridData,并且又希望不要grabExcessHorizontalSpace,则应该手动指定它为false才行。

本文转自博客园八进制的博客,原文链接:SWT的GridData中一个需要注意的地方,如需转载请自行联系原博主。

相关文章
|
8月前
|
SQL 存储 前端开发
JAVA中怎样实现树形菜单
在这篇文章中,作者介绍了如何用两种方法实现目录树数据结构。首先,定义了目录结构在实际开发中的作用,即后端向前端返回整理好的数据,类似书目录的形式。接着,作者逐步讲解了实现目录树的步骤,包括创建数据表、插入数据、创建对象类以及编写逻辑代码。在逻辑代码部分,提供了两种写法,一种适合新手理解,另一种简洁但可能对初学者较难。每种写法都包含了获取数据、转换数据、构建树结构和获取顶层节点的过程。最后,展示了实现后的目录树结构数据。
|
Java
【SWT】常用代码(二)
【SWT】常用代码(二)
155 0
|
Shell API
【SWT】常用代码(三)
【SWT】常用代码(三)
149 0
|
API 数据安全/隐私保护 Android开发
【SWT】常用代码及接口(一)
【SWT】常用代码及接口(一)
217 0
|
Java
控件加在JAVA的PANEL上,怎样才能充满
控件加在JAVA的PANEL上,怎样才能充满
79 0
|
Java
编写Java程序,使用Swing布局管理器与常用控件,实现用户登录界面
编写Java程序,使用Swing布局管理器与常用控件,实现用户登录界面
279 0
编写Java程序,使用Swing布局管理器与常用控件,实现用户登录界面
|
XML Java Android开发
以编程方式在线性布局设置边距实现| Java Debug 笔记
以编程方式在线性布局设置边距实现| Java Debug 笔记
102 0
|
Java
swt java 内嵌ActiveX控件
这里用的是SWT/JFace开发application中SWT自带的org.eclipse.swt.ole.win32 包可以支持内嵌OLE和ActiveX。
229 0
|
Java Android开发
Java的GUI窗体出现乱码解决方法
问题描述:   用java做一个图形化界面的程序,在Eclipse上运行后中文显示乱码,如下图所示: 解决方法:   在要运行的代码上右键 Run As --> Run Configurations...,   在 Arguments --> VM arguments:  中增加下面这句: -Dfile.encoding=gbk  结果: 注意:   我的电脑的编码是:GBK,Ecplise软件的编码是UTF-8。
4482 0

热门文章

最新文章