import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.graphics.*; public class HelloSWT { public static void main(String[] args) { // TODO Auto-generated constructor stub Display display = new Display();//创建一个diaplay对象 Shell shell = new Shell(display);//shell是程序的主窗体 shell.setLayout(null);//设置shell的布局方式 Text hello = new Text(shell ,SWT.MULTI);//声明一个可以显示多行信息的文本框 shell.setText("Java program");//设置主窗体的标题 shell.setSize(200,100);//设置主窗体的大小 Color color = new Color(Display.getCurrent(),255,255,255); //声明颜色对象 shell.setBackground(color);//设置窗体的背景颜色 hello.setText("Hello, SWT World!\n\n你好");//设置文本框信息 hello.pack();//自动调整文本框的大小 shell.open();//打开主窗体 while(!shell.isDisposed()){ if(!display.readAndDispatch()){ display.sleep(); } } display.dispose(); } }
这里构建的是第一个小程序。
分析本例的源代码,可以看到,创建一个典型的SWT应用程序需要以下步骤:
创建一个Display
创建一个或多个shell
设置shell的布局
创建shell中的组件
用open()方法打开shell窗体
写一个事件转发机制
销毁display
SWT中常用的包:
org.eclipse.swt.widgets
Button Text Label Combo Shell(主窗体) Composite(容纳组件的容器)
org.eclipse.swt.layout
org.eclipse.swt.custom
基本图形组件的扩展 如CLabel是对Label的扩展 新的布局方式StackLayout
org.eclipse.swt.event
事件监听类 相应的事件对象 如MouseListener MouseEvent
org.eclipse.swt.graphics
针对图片 光标 字体或绘图API
org.eclipse.swt.ole.win32
用来调用OLE组件 使得SWT程序可以内嵌IE浏览器或者Word Excel程序
Button组件
构造方法:Button(Composite parent, int style)
Composite是shell的父类 style规定button的样式
常用样式style:
SWT.PUSH
SWT.CHECK
SWT.RADIO
SWT.ARROW
SWT.CENTER 文字居中
SWT.LEFT 文字靠左
SWT.RIGHT 文字靠右
SWT.BORDER 深陷型按钮
SWT.FLAT 平面型按钮
可以指定多个样式 用'|'相连
常用方法 setText() setBounds()
Label组件
构造方法和Button类似
Label(Composite parent, int style)
SWT.WRAP 自动换行
SWT.SEPARARATOR 分栏符,默认竖线分栏
SWT.HORIZONTAL 横线分栏符
Label lb1 = new Label(shell,SWT.BORDER|SWT.RIGHT); lb1.setBounds(10,10,70,30); lb1.setText("标签1"); lb1.setFont(new Font(display,"黑体",14,SWT.BOLD)); lb1.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE)); Label lb2 = new Label(shell,SWT.CENTER); lb2.setBounds(90,10,70,30); lb2.setText("标签2"); lb2.setFont(new Font(display,"宋体",14,SWT.NORMAL)); Label lb3 = new Label(shell, SWT.SEPARATOR|SWT.BORDER); lb3.setBounds(10,50,70,30); Label lb4 = new Label(shell,SWT.SEPARATOR|SWT.HORIZONTAL|SWT.BORDER); lb4.setBounds(90,50,70,30);
Text组件
SWT.MULTI 可以输入多行 回车换行
SWT.WRAP 可以输入多行 行尾自动换行
SWT.PASSWORD 密码型 输入字符显示为*
SWT.V_SCROLL 带垂直滚动条
SWT.H_SCROLL 带水平滚动条
Text text4 = new Text(shell,SWT.WRAP|SWT.V_SCROLL); text4.setBounds(90,50,70,70);
下拉框Combo组件
style
SWT.NONE 默认式样
SWT.READ_ONLY 只读
SWT.SIMPLE 无需单击下拉框 列表会一直显示
Combo常用方法
add(String string) 在Combo中增加一项
add(String string, int index) 在Combo中第index项后插入一项
deselectAll() 使Combo中所有选项置空
removeAll() 将Combo中所有选项清空
setItems(String[] items) 将数组中的各项依次加入Combo中
select(int index) 将Combo的第index+1项置为当前选项
bt1.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){ combo.removeAll(); Scanner input = new Scanner(System.in); for(int i=1;i<=3;i++){ String string = input.nextLine(); combo.add(string); } input.close(); combo.select(0); } }); Button bt2 = new Button(shell,SWT.NONE); bt2.setBounds(130,60,100,25); bt2.setText("取值"); bt2.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){ lb.setText("你选择的是"+combo.getText()); } });
上面addSelectionListener方法看起来很特殊传入的参数是一大串 还定义了一个函数
List列表框组件
SWT.MULTI 允许复选
SWT.SINGLE 允许单选
(Combo只允许选择一项,List没有getText()方法,List的取值是用getSelection()方法,返回一个所有选项组成的String数组)
代码以及运行效果和Combo类似
菜单Menu类 Menu是菜单栏 同时也是一个容器 可以容纳菜单项(MenuItem)
Menu的式样
SWT.BAR 菜单栏 用于主菜单
SWT.DROP_DOWN 下拉菜单 用于子菜单
SWT.POP_UP 鼠标右键弹出式菜单
2. MenuItem的式样
SWT.CASCADE 有子菜单的菜单项
SWT.CHECK 选中后前面显示一个小勾
SWT.PUSH 普通型菜单
SWT.RADIO 选中后前面有一个圆点
SWT.SEPARATOR 分隔符
3. 建立菜单的一般步骤
1)首先建立一个菜单栏 需要使用SWT.BAR属性
Menu mainmenu = new Menu(shell,SWT.BAR);
2)在窗体中指定需要显示的菜单栏
shell.setMenuBar(mainMenu);
3)创建顶级菜单栏 需要使用SWT.CASCADE属性
MenuItem fileItem = new MenuItem(mainMenu,SWT.CASCADE); fileItem.setText("文件&F");
4)创建与顶级菜单项相关的下拉式菜单
Menu fileMenu = new Menu(shell,SWT.DROP_DOWN);
5)将顶级菜单与下拉菜单相关
fileItem.setMenu(fileMenu);
二级菜单的创建只需重复以上步骤3)-- 5)
本菜单中创建所有menu对象的第一个参数是shell
创建MenuItem对象的第一个参数是该MenuItem所在的Menu对象
如果某Menu是某MenuItem的子菜单 还要建立关联MenuItem.setMenu(Menu)
下面的代码比之前的复杂
import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.events.*; public class HelloSWT { private static Label lb; public static void main(String[] args) { Display display = new Display(); final Shell shell = new Shell(display); shell.setText("菜单示例"); Menu mainMenu = new Menu(shell,SWT.BAR); shell.setMenuBar(mainMenu); MenuItem fileItem = new MenuItem(mainMenu,SWT.CASCADE); fileItem.setText("文件&F"); Menu fileMenu = new Menu(shell,SWT.DROP_DOWN); fileItem.setMenu(fileMenu);{ MenuItem newFileItem = new MenuItem(fileMenu,SWT.CASCADE); newFileItem.setText("新建&N"); Menu newFileMenu = new Menu(shell,SWT.DROP_DOWN); newFileItem.setMenu(newFileMenu); { MenuItem newProjectItem = new MenuItem(newFileMenu,SWT.PUSH); newProjectItem.setText("项目\tCtrl+Shift+N"); newProjectItem.setAccelerator(SWT.CTRL+SWT.SHIFT+'N'); newProjectItem.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){ Text text = new Text(shell,SWT.MULTI|SWT.BORDER|SWT.WRAP); text.setBounds(10,10,100,30); text.setText("你选择了“新建项目”"); } }); new MenuItem(newFileMenu,SWT.SEPARATOR); new MenuItem(newFileMenu,SWT.PUSH).setText("包"); new MenuItem(newFileMenu,SWT.PUSH).setText("类"); } MenuItem openFileItem = new MenuItem(fileMenu,SWT.CASCADE); openFileItem.setText("打开&O"); MenuItem exitItem = new MenuItem(fileMenu,SWT.CASCADE); exitItem.setText("退出&E"); } MenuItem helpItem = new MenuItem(mainMenu,SWT.CASCADE); helpItem.setText("帮助&H"); shell.pack(); shell.open(); while(!shell.isDisposed()){ if(!display.readAndDispatch()){ display.sleep(); } } display.dispose(); } }