1.基本认识
我们知道,Eclipse RCP是富客户端开发,那么认识其UI框架是绕不开的一步。这里我们先研究学习下其UI框架。
由于Eclipse RCP目前市面上用得不多,加之时间有限,那么这里我的学习思路是俯瞰了解整体,后续有用到的地方,再深入研究。
还是先看下面两张图:
这里我们可以看到,应用程序整个窗口叫做Workbench(工作台)。workbench是由SWT、JFace绘制而成。
涉及下面几个jar包:
org.eclipse.swt
org.eclipse.jface
org.eclipse.ui
org.eclipse.ui.workbench
可以大致理解为:
SWT 是Eclipse中的窗口小部件工具箱。(对比Sun的AWT与Swing。)
JFace对SWT进行了封装,JFace = SWT + MVC
2.常用组件
有了基本认识,那么接下来就是学习具体的组件。下图是一些常用组件、布局等涉及的类间继承关系,先有个大致印象:
最顶层的Widget是一个抽象类,定义了控件的基本属性,Contorl实现Drawable接口,由Control往下,衍生出了各样式的控件。
2.1 Label
Label是一个标签类,用于显示文字。
基本使用:
Label label = new Label(parent, SWT.NONE);
label.setText("label");
这里注意,新构造一个控件,逐级调用构造函数,最终调用的是 Widget (Widget parent, int style) ,需要传入两个参数:第一个参数parent,表明它属于哪个控件,或者说在哪个控件上显示,第二个参数style,表明该控件的风格,比如具有边框SWT.BORDER。
2.2 Button
Button是按钮类。
基本使用:
Button btn = new Button(parent,SWT.PUSH);
btn.setText("push");
代码展示的是一个普通按钮。SWT中,Button分为以下几种:
SWT.PUSH // 普通按钮
SWT.CHECK // 复选框按钮
SWT.RADIO // 单选按钮
SWT.TOGGLE // 带状态的普通按钮
SWT.ARROW // 箭头按钮
SWT.FLAT // 扁平按钮
SWT.BORDER // 带边框的按钮
分别对应下图:
对于按钮来讲,事件是不可或缺的:
btn.addMouseListener(new MouseListener() {
@Override
public void mouseDoubleClick(MouseEvent e) {
System.out.println("双击 " + e.button);
}
@Override
public void mouseDown(MouseEvent e) {
System.out.println("单击 " + e.button);
}
@Override
public void mouseUp(MouseEvent e) {
System.out.println("up " + e.button);
}
});
其它事件listener见下文。
2.3 Text
Text是文本显示,由继承关系图中可以看到,Text继承自Scrollable,具有可滚动属性。
基本使用:
Text text = new Text(parent,SWT.BORDER);
Text text2 = new Text(parent,SWT.BORDER|SWT.PASSWORD);// 密码显示
Text text3 = new Text(parent,SWT.BORDER|SWT.READ_ONLY);// 只读
text3.setText("Read only");
// 多行显示 垂直滚动
Text text4 = new Text(parent,SWT.BORDER|SWT.MULTI|SWT.WRAP|SWT.V_SCROLL);
text4.setLayoutData(new GridData(GridData.FILL_BOTH));
对应下图:
2.4 Combo
Combo是下拉框列表。
基本使用:
String[] items = {"Java","C++","Python"};
Combo combo = new Combo(parent,SWT.DROP_DOWN);
combo.setItems(items);
Combo combo2 = new Combo(parent,SWT.SIMPLE);
combo2.setItems(items);
对应下图:
第一种风格是点击向下小箭头,弹出下拉框,第二种风格是在控件下方直接显示下拉框。
2.5 List
List是列表控件。
基本使用:
String[] items = {"Java","C++","Python","Mysql","Oracle","C#"};
List list = new List(group,SWT.BORDER);
list.setItems(items);
List list2 = new List(group,SWT.BORDER|SWT.MULTI);
list2.setItems(items);
String[] items = list.getSelection(); // 获取所选择的项
对应下图:
一个单选,一个多选。
3.常用事件
有了控件,那么就必定会有对应的事件。事件不区分控件。
下面是事件的大致分类:
- 鼠标事件
- 键盘事件
- 焦点事件
- 选择组事件
- 窗口控制事件
- 其它
3.1 鼠标事件
MouseListener 鼠标的点击事件
定义:
public interface MouseListener extends SWTEventListener
public interface SWTEventListener extends EventListener(package org.eclipse.swt.internal)
public interface EventListener (package java.util)
基本使用:
// 可用于Button控件
btn.addMouseListener(new MouseListener() {
@Override
public void mouseDoubleClick(MouseEvent e) {
//e.button :1 左键 2 中键 3 右键
System.out.println("双击 " + e.button);
}
@Override
public void mouseDown(MouseEvent e) {
System.out.println("单击 " + e.button);
}
@Override
public void mouseUp(MouseEvent e) {
System.out.println("up " + e.button);
}
});
MouseMoveListener 鼠标的移动事件
定义:
public interface MouseMoveListener extends SWTEventListener
基本使用:
btn.addMouseMoveListener(new MouseMoveListener() {
@Override
public void mouseMove(MouseEvent e) {
System.out.println( e.x + "," + e.y);
}
});
MouseTrackListener 鼠标轨迹事件
定义:
public interface MouseTrackListener extends SWTEventListener
基本使用:
btn.addMouseTrackListener(new MouseTrackListener() {
@Override
public void mouseEnter(MouseEvent e) {
// 鼠标进入
System.out.println("mouseEnter");
}
@Override
public void mouseExit(MouseEvent e) {
// 鼠标悬停
System.out.println("mouseExit");
}
@Override
public void mouseHover(MouseEvent e) {
// 鼠标退出
System.out.println("mouseHover");
}
});
3.2 键盘事件
定义:
public interface KeyListener extends SWTEventListener
基本使用:
// 可用于Text控件
text.addKeyListener(new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
// 键按下
System.out.println("keyPressed: " + e.character);
}
@Override
public void keyReleased(KeyEvent e) {
// 键松开
System.out.println("keyReleased: " + e.character);
}
});
3.3 焦点事件
定义:
public interface FocusListener extends SWTEventListener
基本使用:
text.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
// 获得焦点
System.out.println("focusGained");
}
@Override
public void focusLost(FocusEvent e) {
// 失去焦点
System.out.println("focusLost");
}
});
3.4 选择组件事件
// 可用于List
list.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
System.out.println("select:" + list.getSelection()[0]);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
3.5 窗口控制事件
ControlListener
定义:
public interface ControlListener extends SWTEventListener
基本使用:
parent.addControlListener(new ControlListener() {
@Override
public void controlMoved(ControlEvent e) {
System.out.println("controlMoved");
}
@Override
public void controlResized(ControlEvent e) {
System.out.println("controlResized");
}
});
3.6 其它
VerifyListener
定义:
public interface VerifyListener extends SWTEventListener
基本使用:
Text text = new Text(parent,SWT.BORDER);
text.addVerifyListener(new VerifyListener() {
@Override
public void verifyText(VerifyEvent e) {
e.doit = false;
char c = e.character;
// 文本框中只允许输入字符0
if(c == '0') {
e.doit = true;
}
}
});
上面代码可以对Text做一个输入限制。
至此,我们对UI控件的创建使用及其事件,有了一个基本的认识。
下篇学习控件的布局、容器等的使用,用于构建复杂的界面。