Eclipse的Workbench是基于SWT(Standard Widget Toolkit)和JFace开发的。
他们与Java的AWT和Swing不同在于他们是直接调用操作系统的API,所以,不同操作系统的控件并不一样。
JFace是基于SWT开发的,相比SWT而言,已经解决了一些常见问题,使用户将精力集中在自己的控件创建上。
SWT一般流程:
1.创建一个Display对象,Display负责沟通SWT和操作系统
2.创建一个或多个Shell对象,Shell代表程序的窗口
3.在Shell中创建各种控件,为控件添加监听器
4.调用Shell对象的open()方法显示窗口
5.开始对各种事件进行响应并处理,直至程序发出退出消息
6.调用Display对象的dispose()方法,结束程序
SWT类结构:
org.eclipse.swt.widget/custom
Widget:抽象类,类似于AWT的Component类和Swing的JComponent
->Control:抽象类,控件类
->Button
->Label
->Link
->ProgressBar
->Slider
->Scrollable
->Composite:容器类,类似AWT的Container和Swing的JPanel
->List
->Text
->Item:抽象类,其他控件包含的小部件,如列表和表的选项
->Menu
->ScrollBar
超出操作系统以外的控件以"C"开头。
JFace一般流程:
1.继承ApplicationWindow类,重写createContents(Composite parent)方法,将创建组件写入该方法。
2.实例化该类,调用open()方法显示窗口,
3.调用Display对象的dispose()方法,结束程序
Control接口
创建并添加到父控件中:Control(Composite parent, int style)
设置大小和相对于父控件的位置:setBounds(int x, int y, int width, int height)
setEnabled(boolean enabled)
setVisible(boolean visible)
setToolTipText(String string)
setFont(Font font)
setForeground(Color color)
setBackground(Color color)
setCursor(Cursor cursor)
Button类
设置按键文字:setText(String string)
设置按键图案:setImage
设置样式和文字对齐方式
Label类
设置按键文字:setText(String string)
设置按键图案:setImage
设置为分隔符,可换行,边框和对齐方式
Text类
设置单行,多行,只读,滚动轴
Combo类
设置内容:setItem(int index, String value), setItems(array[] a)
设置关联内容:setData(String key, Object value)
设置选中项:setSelect(int i)
List类
类似Combo,只是没有下拉菜单
事件监听机制
鼠标事件:
按下,松开,双击:addMouseListener(MouseListener l)
移动:addMouseMoveListener(MouseMoveListener l)
进入,离开,悬停:addMouseTrackListener(MouseTrackListener l)
滚轮:addMouseWheelListener(MouseWheelListener l)
键盘事件:
按下,松开:addKeyBoradListener(KeyListener l)
焦点事件:
获焦,失焦:addFocusListener(FocusListener l)
窗口控制事件:
移动,调整大小:addControlListener(ControlListener l)
选择事件:
addSelectListener(SelectionListener l)
F1帮助事件:
addHelpListener(HelpListener l)
校验事件:只有文本控件才可添加。 e.doit = true 才会表示修改有效
addVerifyListener(VerifyListener l)
修改事件:只有文本控件才可添加
VerifyListener(ModifyListener l)
其他通用事件:
addListener(int eventType, Listener l)
布局
FillLayout:子组件以相同的大小填充到父组件:
1.通过一行(SWT.HORIZONTAL,SWT.VERTICAL)或一列的形式排列
2.设置marginHeight,marginWidth,spacing来设置上下,左右边距和子组件间距
RowLayout:子组件将在父组件中按行显示
1.设置type表示排列方向,wrap换行,pack保持自组件大小,justify子组件是否根据父组件调整
2.设置marginLeft,marginTop,marginRight,marginBottom,spacing
3.子组件通过setLayoutData(RowData rd)设置自身大小
GridLayout:网格式布局,可以指定子组件占父组件几个格,以及组件填充到哪几个网格
1.设置numColumns设置分几列显示子组件,markColumnsEqualWidth列宽相同
2.marginLeft,marginRight,marginTop,marginBottom,horizontalSpacing,verticalSpacing调整间距
3.子组件通过setLayoutData(GridData gd)设置自身显示方式
3.1 horizontalAlignment,verticalAlignment(GRIDData.BEGINNING/CENTER/END/FILL)
3.2 horizontalIndent偏移量,horizontalSpan占据几个单元格
FormLayout:通过FormAttachment,以父组件或子组件的边作为相对位置,进行布局
容器
面板:Composite
分组框:Group,可设置标题
分页框:Tab
TabFolder tf = new TabFolder(shell,SWT.BORDER)
TabItem ti = new TabItem(tf,SWT.NULL)
ti.setText(String s);
ti.setControl(Composite c)
分割框:SashForm
SashForm sf = new SashForm(shell,SWT.HORIZONTAL)
sf.setWeights(new int[]{1,2,3})
Text t = new Text(sf,SWT.CENTER)
菜单和工具栏
//设置MenuBar
Menu menuBar = new Menu(shell, SWT.BAR);
shell.setMenuBar(menuBar);
//设置Menu按钮
MenuItem fileMenuButton = new MenuItem(menuBar, SWT.CASCADE);
fileMenuButton.setText("File");
Menu fileMenuDropDown = new Menu(shell, SWT.DROP_DOWN);
fileMenuButton.setMenu(fileMenuDropDown);
//设置Menu选项
MenuItem fileOpen = new MenuItem(fileMenuDropDown, SWT.PUSH);
fileOpen.setText("Open");
MenuItem fileSave = new MenuItem(fileMenuDropDown, SWT.PUSH);
fileSave.setText("Save");