【插件开发】—— 5 SWT控件以及布局使用
前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知
经过前几篇的介绍,多少对SWT又有了一些认识,那么这篇继续来看一下一些控件的组合使用。
首先是几种简单的控件,Label,Text,Button,Combo这些都是些常用的简单框架,但是为了能够构造出整齐的布局,还是要多花些心思的。
除了这些简单的控件外,还有点复杂的控件,比如Table和树、选项卡和菜单等等,这里就先不做介绍了。
为了整个这些控件,经常要使用两个组合控件以及多种布局。
1 【Group 组】,这个组可以为我们生成一个带有线的框,这样可以把杂乱的控件放到一个规整的容器内。
2 【Composite 组合控件】,它是为了拼接一些简单的控件,形成具有复杂功能的整合控件。
比如文件路径的浏览,往往就需要一个文件浏览的按钮,和一个文本框。
这里先放出一段代码,代码中使用到了简单的布局模型GridLayout(),以及组和组合控件,还有一些简单的控件。形成一个登陆界面,并且单击按钮可以出发响应事件。效果图如下:
登录前:
登陆后:
实现代码如下:
1 package com.xingoo.plugin.swttest.test;
2
3 import org.eclipse.swt.SWT;
4 import org.eclipse.swt.events.SelectionAdapter;
5 import org.eclipse.swt.events.SelectionEvent;
6 import org.eclipse.swt.layout.FillLayout;
7 import org.eclipse.swt.layout.GridData;
8 import org.eclipse.swt.layout.GridLayout;
9 import org.eclipse.swt.widgets.Button;
10 import org.eclipse.swt.widgets.Combo;
11 import org.eclipse.swt.widgets.Composite;
12 import org.eclipse.swt.widgets.Group;
13 import org.eclipse.swt.widgets.Label;
14 import org.eclipse.swt.widgets.MessageBox;
15 import org.eclipse.swt.widgets.Shell;
16 import org.eclipse.swt.widgets.Text;
17
18 import com.xingoo.plugin.swttest.Abstract.AbstractExample;
19
20 public class Test extends AbstractExample{
21 private Label infoLabel;
22 private Text usernameText;
23 private Text passwordText;
24 private Combo roleCombo;
25
26 public static void main(String[] args) {
27 new Test().run();
28 }
29 public void todo(Shell shell) {
30 Group testGroup = new Group(shell,SWT.NONE);
31 testGroup.setText("User Login");
32 GridLayout layout = new GridLayout();
33 layout.numColumns = 2;
34 layout.marginWidth = 30;
35 layout.marginHeight = 10;
36 testGroup.setLayout(layout);
37 testGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
38 {
39 Composite composite = new Composite(testGroup,SWT.NONE);
40 GridLayout layoutComposite = new GridLayout();
41 layoutComposite.numColumns = 2;
42 layoutComposite.marginHeight = 1;
43 composite.setLayout(layoutComposite);
44 composite.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,2,2));
45
46 infoLabel = new Label(composite,SWT.NONE);
47 infoLabel.setText("请输入用户名 密码");
48 infoLabel.setLayoutData(new GridData(GridData.FILL_BOTH));
49 infoLabel.setAlignment(SWT.RIGHT);
50 }
51 {
52 Label usernameLabel = new Label(testGroup,SWT.NONE);
53 usernameLabel.setText("username:");
54
55 usernameText = new Text(testGroup,SWT.BORDER);
56 usernameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
57 }
58 {
59 Label passwordLabel = new Label(testGroup,SWT.NONE);
60 passwordLabel.setText("password:");
61
62 passwordText = new Text(testGroup,SWT.BORDER | SWT.PASSWORD);
63 passwordText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
64 }
65 {
66 Label roleLabel = new Label(testGroup,SWT.NONE);
67 roleLabel.setText("role:");
68
69 roleCombo = new Combo(testGroup,SWT.DROP_DOWN);
70 roleCombo.setItems(new String[]{"Admin","custom"});
71 roleCombo.select(1);
72 }
73 {
74 new Label(testGroup,SWT.NONE);
75
76 Button rememberPWBtn = new Button(testGroup,SWT.CHECK);
77 rememberPWBtn.setText("记住密码");
78 }
79 {
80 new Label(testGroup,SWT.NONE);
81
82 Button autoLoginBtn = new Button(testGroup,SWT.CHECK);
83 autoLoginBtn.setText("自动登录");
84 }
85 {
86 new Label(testGroup,SWT.NONE);
87
88 Button loginBtn = new Button(testGroup,SWT.PUSH);
89 loginBtn.setText("登录");
90
91 loginBtn.addSelectionListener(new SelectionAdapter() {
92 public void widgetSelected(SelectionEvent evt){
93 infoLabel.setText("登陆成功");
94
95 usernameText.setText("");
96 usernameText.setEnabled(false);
97
98 passwordText.setText("");
99 passwordText.setEnabled(false);
100
101 roleCombo.setEnabled(false);
102 }
103 });
104 }
105 }
106 }
注意其中的一些技巧:
30-36行:我们创建了一个组控件,并且使用了网格布局,设置每行有两列。并且设置了组内填充边界,marginWidth以及marginHeight。
39-49行:我们创建了一个组合对象,使他占有了两个列元素。并且设置组内为两列的网格布局。
关于事件的监听,之后也会搜集整理出一些常用的事件。
剩下的就比较好理解了,当没有空间元素填补的时候,为了防止布局错乱,创建了一个空的Label对象用来占位。
new Label(testGroup,SWT.NONE);
这里面使用到了一个前文提到的抽象类,这里再贴出来一次。
1 package com.xingoo.plugin.swttest.Abstract;
2
3 import org.eclipse.swt.layout.FillLayout;
4 import org.eclipse.swt.widgets.Display;
5 import org.eclipse.swt.widgets.Shell;
6
7 public abstract class AbstractExample{
8 public void run(){
9 Display display = new Display();
10 Shell shell = new Shell(display);
11 shell.setText("shell example");
12 shell.setBounds(200,200,400,280);
13 shell.setLayout(new FillLayout());
14 todo(shell);
15 shell.open();
16
17 while(!shell.isDisposed()){
18 if(!display.readAndDispatch())
19 display.sleep();
20 }
21 //dispose the resource
22 display.beep();
23 display.dispose();
24 }
25 public abstract void todo(Shell shell);//extension something here
26 }
后续将会更新,复杂控件以及布局模型的介绍。
- IE10预览:HTML5初探 翻译自Sencha
- 免插件仅代码实现WordPress评论回复邮件
- ASP.NET Core 1.1 简介
- 使用 Roslyn 编译器服务
- ExtJS4预览:渲染过程重构和标准化
- Ext JS 4预览:更快、更简单、更稳定
- VR技术的进步推动工业机器人革命
- tLinux 2.2下安装Mono 4.8
- WordPress评论回复邮件样式美化教程
- 基于Aspose.Pdf把pdf文件每一页转换为图片
- 分布式文件存储的数据库开源项目MongoDB
- 使用 JavaScriptService 在.NET Core 里实现DES加密算法
- 拒绝全英文垃圾评论!仅用代码实现
- 在.NET Core 里使用 BouncyCastle 的DES加密算法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法