import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class QQ {
/**
*
为了自定义监听器类MyMouseLister中的代码能访问到以下对象,故将这些对象定义成 类的实例变量
*/
private StackLayout stackLayout = new
StackLayout();
private Composite yourDataComp;
private Composite otherComp;
private List selectList;
private Composite rightComp;
/**
*
由于自定义方法较多程序较长,这次的主程序框架选择了Eclipse“新建”向导的第二种: “public open() mothd”
*/
public static void main(String[] args) {
try {
QQ window = new QQ();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}
public void open() {
Display display =
Display.getDefault();
Shell shell = new
Shell();
shell.setSize(550, 350);
shell.setText("个人设置");
shell.setLayout(new
GridLayout());
{
//分割窗口
SashForm sashForm = new SashForm(shell, SWT.BORDER);
sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
{
//分割窗左边的列表框
selectList = new List(sashForm, SWT.BORDER);
//作为演示只加了两项
selectList.setItems(new String[] { "个人资料", "联系方式" });
//加一个鼠标监听器
selectList.addMouseListener(new MyMouseLister());//
}
{
//右边的堆栈式面板
rightComp = new Composite(sashForm, SWT.NONE);
rightComp.setLayout(stackLayout);
//共两页。将生成此面板的代码提出成一个方法,保证代码结构的清晰。
yourDataComp = createYourDataComp(rightComp);//个人资料的面板
otherComp = createOtherComp(rightComp);//联系方式的面板
//在堆栈面板上先显示“个人资料”界面
stackLayout.topControl = yourDataComp;
}
//分割窗口的左右空间比例
sashForm.setWeights(new int[] { 1, 4 });
}
{
//界面的按钮的面板
Composite buttonComp = new Composite(shell, SWT.BORDER);
//使用GridData设置buttonComp在它父容器Shell中的布局方式
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.END;//让buttonComp向右靠
buttonComp.setLayoutData(gridData);
//设置buttonComp的布局为RowLayout,用来设定buttonComp内组件的布局方式
RowLayout rowLayout = new RowLayout();
rowLayout.spacing = 15;//按钮之间间隔15个像素
buttonComp.setLayout(rowLayout);
//在buttonComp下建立三个按钮
new Button(buttonComp, SWT.NONE).setText("
确定 ");
new Button(buttonComp, SWT.NONE).setText("
取消 ");
new Button(buttonComp, SWT.NONE).setText("
应用 ");
}
shell.layout();
shell.open();
while
(!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
/** 个人资料面板的生成 */
private Composite createYourDataComp(Composite
rightComp) {
Composite composite =
new Composite(rightComp, SWT.NONE);
composite.setLayout(new
GridLayout(6, false));//个人资料面板分成6列
//---------用户号码的标签及其文本框
new Label(composite,
SWT.NONE).setText("用户号码:");
//只读型的文本框
Text text = new
Text(composite, SWT.READ_ONLY | SWT.BORDER);
//水平抢占式充满,并占用三列的空间.
createGridData是自定义方法
text.setLayoutData(createGridData(GridData.FILL_HORIZONTAL, 3));
//---------图片部份.我们再用一个面板嵌套来管理
Composite photoComp =
new Composite(composite, SWT.BORDER);
//水平垂直对齐式充满,横占两列,竖占4行.
photoComp.setLayoutData(createGridData(GridData.HORIZONTAL_ALIGN_FILL
| GridData.VERTICAL_ALIGN_FILL, 2, 4));
photoComp.setLayout(new
GridLayout(2, false));//分2列
{
//图片. Image类的使用暂时还没有讲到,我们先用一个Composite来代替图片.
Composite tempComp = new Composite(photoComp, SWT.BORDER);
tempComp.setLayoutData(new GridData(50, 50));//设定大小:宽50,高50
//选择图片的箭头型按钮,并设置它向下靠
Button selPhotoButton = new Button(photoComp, SWT.ARROW |
SWT.DOWN);
selPhotoButton.setLayoutData(new
GridData(GridData.VERTICAL_ALIGN_END));
//升级成为会员的按钮.横占photoComp的两列,并横向对齐充满
Button updateButton = new Button(photoComp, SWT.NONE);
updateButton.setLayoutData(createGridData(GridData.HORIZONTAL_ALIGN_FILL,
2));
updateButton.setText("升级成为会员");
}
new Label(composite,
SWT.NONE).setText("用户呢称:");
Text nicknameText = new
Text(composite, SWT.BORDER);
nicknameText.setLayoutData(createGridData(GridData.HORIZONTAL_ALIGN_FILL,
3));
new Label(composite,
SWT.NONE).setText("个性签名:");
Text attachNameText =
new Text(composite, SWT.BORDER);
attachNameText.setLayoutData(createGridData(GridData.HORIZONTAL_ALIGN_FILL,
3));
new Label(composite,
SWT.NONE).setText("等 级:");
{
//Image类的使用暂时还没有讲到,我们先用一个Composite来代替图片
Composite tempComp = new Composite(composite, SWT.BORDER);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL |
GridData.VERTICAL_ALIGN_BEGINNING);
gridData.horizontalSpan = 3;
//Composite默认的高度太高,故手工设定高度为20像素
gridData.heightHint = 20;
tempComp.setLayoutData(gridData);
}
new Label(composite,
SWT.NONE).setText("性 别:");
Combo sexCombo = new
Combo(composite, SWT.NONE);
new Label(composite,
SWT.NONE).setText("姓名:");
Text nameText = new
Text(composite, SWT.BORDER);
nameText.setLayoutData(new
GridData(GridData.HORIZONTAL_ALIGN_FILL));
new Label(composite,
SWT.NONE).setText("年龄:");
Text oldText = new
Text(composite, SWT.BORDER);
oldText.setLayoutData(new
GridData(GridData.HORIZONTAL_ALIGN_FILL));
new Label(composite,
SWT.NONE).setText("毕业院校:");
Text schoolText = new
Text(composite, SWT.BORDER);
schoolText.setLayoutData(createGridData(GridData.HORIZONTAL_ALIGN_FILL,
3));
new Label(composite,
SWT.NONE).setText("生肖:");
Combo animalCombo = new
Combo(composite, SWT.NONE);
animalCombo.setLayoutData(new
GridData(GridData.HORIZONTAL_ALIGN_FILL));
new Label(composite,
SWT.NONE).setText("职 业:");
Text jobText = new
Text(composite, SWT.BORDER);
jobText.setLayoutData(createGridData(GridData.HORIZONTAL_ALIGN_FILL,
3));
new Label(composite,
SWT.NONE).setText("星座:");
Combo constellationCombo
= new Combo(composite, SWT.NONE);
constellationCombo.setLayoutData(new
GridData(GridData.HORIZONTAL_ALIGN_FILL));
Label introLabel = new
Label(composite, SWT.NONE);
//默认是居中,改为顶端对齐
introLabel.setLayoutData(new
GridData(GridData.VERTICAL_ALIGN_BEGINNING));
introLabel.setText("个人说明:");
Text introText = new
Text(composite, SWT.BORDER | SWT.WRAP);//WRAP自动换行
introText.setLayoutData(createGridData(GridData.HORIZONTAL_ALIGN_FILL
| GridData.FILL_VERTICAL, 5));
//返回个人资料面板composite
return composite;
}
/** 生成一个简单的联系方式的面板 */
private Composite createOtherComp(Composite
rightComp) {
Composite composite =
new Composite(rightComp, SWT.NONE);
composite.setLayout(new
FillLayout());
new Label(composite,
SWT.NONE).setText("联系方式面板");
return composite;
}
/**
*
生成GridData对象的重复代码太多,写成一个方法可以减少程序的行数,用起来也方便
*
而且还要注意一个GridData只能被一个组件使用,不能两个组件使用一个GriData, 则 有一个组件将不会显示出来
*/
private GridData createGridData(int style, int
horizontalSpan) {
GridData gridData = new
GridData(style);
gridData.horizontalSpan
= horizontalSpan;
return gridData;
}
private GridData createGridData(int style, int
horizontalSpan, int verticalSpan) {
GridData gridData = new
GridData(style);
gridData.horizontalSpan
= horizontalSpan;
gridData.verticalSpan =
verticalSpan;
return gridData;
}
/** 鼠标监听器,采用事件的命名内部类的写法 */
private class MyMouseLister extends MouseAdapter
{
public void
mouseDown(MouseEvent e) {
//得到列表的当前选择项的序号(即单击的那项)
int selectionIndex = selectList.getSelectionIndex();
//如果单击第一项"个人资料",则让相对应的面板移至最上面
if (selectionIndex == 0)
stackLayout.topControl = yourDataComp;
else
stackLayout.topControl = otherComp;
rightComp.layout();//刷新堆栈式布局的顶容器
}
};
}