服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

实战swt布局


  标准的swt布局类
filllayout:在容器中以相同的大小单行或单列的排列组件
rowlayout:以单行或多行的方式使用几个选项(fill,wrap,spacing,justify,type)定制组件的排列方式
gridlayout:类似于swing的gridlayout的方式以格子的方式排列组件
formlayout(swt 2.0的新特性):通过定义组件四个边的“粘贴”位置来排列组件,被引用的相对的组件可以父组件,也可以是同一容器中的其它组件。
在swt中,可以由用户自定义布局类。

在简单的布局中,使用filllayout和rowlayout也许就够用了,也比较简单。但是通常的布局都比较复杂,而且要求很精确。无论复杂程度如何,都可以由gridlayout或formlayout来完成。通常gridlayout与formlayout可以做成同样的效果,但是使用formlayout更有效,不会像gridlayout产生resize导致的布局错位,也更简单。下面通过一个例子简单介绍formlayout的使用。

布局效果


布局实施
1.首先定义窗口和它的空白边
display.getdefault().dispose(); //移去平台核心启动画面
display = new display();
shell = new shell(display, swt.title);
formlayout layout = new formlayout();
layout.marginheight = 10;
layout.marginwidth = 20;
shell.setlayout(layout);
shell.settext("用户登录");

2.创建窗口上的元素,其中下面的两个button由一个使用rowlayout的组件来包容。
name = new label(shell, swt.none);
name.settext("用户名");
nametext = new text(shell, swt.single | swt.border);
pass = new label(shell, swt.none);
pass.settext("密码");
passtext = new text(shell, swt.single | swt.border);
passtext.setechochar(´*´);
passtext.settabs(2);
bottom = new composite(shell, swt.none);
rowlayout rowlayout = new rowlayout();
rowlayout.justify = true; //justify定义组件在容器中分散开,效果类似于swing的flowlayout
bottom.setlayout(rowlayout);

3.定义name标签的位置。它的顶边离父组件(窗口shell)的空白边距离是父组件clientarea(除空白边以外的空间)高度(height)的15%,偏移的点数(points)为0。
formdata data = new formdata();
data.top = new formattachment(15, 0);
name.setlayoutdata(data);

4.定义name文本输入的位置。它的顶边在name标签的中心位置(这不是正确的表达,但程序是这样解释,事实上它的中心位置与name标签在同一条水平线上),左边距name标签的右边有10个点。
data = new formdata();
data.top = new formattachment(name, 0, swt.center);
data.left = new formattachment(name, 10, swt.right);
nametext.setlayoutdata(data);

5.定义pass标签的位置。它的顶边距name标签的底边有10个点数的偏移。
data = new formdata();
data.top = new formattachment(name, 10, swt.bottom);
pass.setlayoutdata(data);

6.定义pass文本输入的位置。它的顶边在name标签的中心位置(同上),左边与name文本框的左边对齐。
data = new formdata();
data.top = new formattachment(pass, 0, swt.center);
data.left = new formattachment(nametext, 0, swt.left);
passtext.setlayoutdata(data);

7.定义bottom组件的位置。它的顶边距pass标签的底边15个点数,左边与pass标签的左边对齐,右边与pass文本输入的右边对齐。
data = new formdata();
data.top = new formattachment(pass, 15, swt.bottom);
data.left = new formattachment(pass, 0, swt.left);
data.right = new formattachment(passtext, 0, swt.right);
bottom.setlayoutdata(data);

完整的源码
import org.eclipse.swt.swt;
import org.eclipse.swt.events.selectionadapter;
import org.eclipse.swt.events.selectionevent;
import org.eclipse.swt.graphics.rectangle;
import org.eclipse.swt.layout.formattachment;
import org.eclipse.swt.layout.formdata;
import org.eclipse.swt.layout.formlayout;
import org.eclipse.swt.layout.rowlayout;
import org.eclipse.swt.widgets.button;
import org.eclipse.swt.widgets.composite;
import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.label;
import org.eclipse.swt.widgets.shell;
import org.eclipse.swt.widgets.text;

import cn.com.efly.clientframe.core.hook;

/**
* @author efly
* @version 1.0.0,11/22/02
*/
public final class loginui {
private display display;
private shell shell;
private composite bottom;
private label name;
private label pass;
private text nametext;
private text passtext;
private button ok;
private button exit;
private rectangle clientarea;
private roothook roothook;

public loginui(hook hook) {
roothook = (roothook) hook;
}

/**
* 显示登陆界面
*/
public void show() {
display.getdefault().dispose();
display = new display();
clientarea = display.getclientarea();
shell = new shell(display, swt.title);
formlayout layout = new formlayout();
layout.marginheight = 10;
layout.marginwidth = 20;
shell.setlayout(layout);
shell.settext("用户登录");

name = new label(shell, swt.none);
name.settext("用户名");
nametext = new text(shell, swt.single | swt.border);
pass = new label(shell, swt.none);
pass.settext("密码");
passtext = new text(shell, swt.single | swt.border);
passtext.setechochar(´*´);
passtext.settabs(2);
bottom = new composite(shell, swt.none);
rowlayout rowlayout = new rowlayout();
rowlayout.justify = true;
bottom.setlayout(rowlayout);
ok = new button(bottom, swt.push);
ok.settext("确定");
ok.addselectionlistener(new selectionadapter() {
public void widgetselected(selectionevent event) {
ok();
}
});
exit = new button(bottom, swt.push);
exit.settext("取消");
exit.addselectionlistener(new selectionadapter() {
public void widgetselected(selectionevent event) {
cancel();
}
});

formdata data = new formdata();
data.top = new formattachment(15, 0);
name.setlayoutdata(data);

data = new formdata();
data.top = new formattachment(name, 0, swt.center);
data.left = new formattachment(name, 10, swt.right);
nametext.setlayoutdata(data);

data = new formdata();
data.top = new formattachment(name, 10, swt.bottom);
pass.setlayoutdata(data);

data = new formdata();
data.top = new formattachment(pass, 0, swt.center);
data.left = new formattachment(nametext, 0, swt.left);
passtext.setlayoutdata(data);

data = new formdata();
data.top = new formattachment(pass, 15, swt.bottom);
data.left = new formattachment(pass, 0, swt.left);
data.right = new formattachment(passtext, 0, swt.right);
bottom.setlayoutdata(data);

shell.pack();
rectangle shellbounds = shell.getbounds();
shell.setlocation(
(clientarea.width - shellbounds.width) / 2,
(clientarea.height - shellbounds.height) / 2);

shell.open();

while (!shell.isdisposed()) {
if (!display.readanddispatch())
display.sleep();
}
}

private void dispose() {
display.dispose();

}

private void cancel() {
dispose();
}

private void ok() {
verify();
}

private void verify() {
roothook.runplatform();
}

public static void main(string[]){
new loginui(null).show();
}
}

扫描关注微信公众号