SWT/JFace的基本介绍
1.1 Face与其他图形界面设计工具的比较
Java图形界面实现方式有很多,比如AWT、SWING和SWT等。AWT和SWING不论是在速度上还是美观上都有很大的不足;对于比较庞大而复杂的系统,用AWT或SWING相很难实现,因为运行的速度会相当的慢。SWT直接使用操作系统提供的本地图形接口,具备本地化的Look & Feel,效率高且美观。因此,本项目选择SWT作为图形界面开发基础工具包。
图2-1为SWT原理图,图2-2为JFace原理图
图2-1
|
图2-2
|
SWT把Win32的API简单的包装了一下,系统在SWT这一层调用的方法、传递的参数被原封不动的代理到了Win32层。这是SWT的核心思想。SWT有一个很重要的设计原则,那就是,SWT的API一对一的封装OS的API,完全忠实于操作系统的API实现的行为,如果有bug,那也是OS的bug,它不会尝试去“纠正”操作系统,因为那样会潜在的破坏本地化的一些行为。忠实于OS也使得调用者不必但心自己的SWT程序会跟OS的本地GUI有不一致的地方。因此,SWT拥有标准的与操作系统相同的外观,几乎没有人能看出你的程序是用Java写出来的,更为重要的是,其程序运行的效率可以和VC++写出的程序向媲美,而且开发的效率也不在AWT/SWING之下。
1.2 如何创建简单的SWT/JFace程序
1.2.1如何在Eclipse中建立一个SWT/JFace工程
依次File→New→other 就会看到
然后按向导往下操作即可新建一个SWT/JFace工程,该工程跟其他的Jave工程没有多大的区别
1.2.2一个简单的HelloWorld小例子
publicclass HelloWorld{
publicstaticvoid main(String[] args){
Display display=new Display();
Shell shell=new Shell(display,SWT.V_SCROLL|SWT.SHELL_TRIM);
shell.setText("This is my label");
shell.setBounds(100,100,500,200);
shell.setLayout(new FillLayout());
//Color red=new Color(display,255,0,0);
Label label1=new Label(shell,SWT.CENTER);
label1.setText("Hello word");
label1.setLocation(100,100);
label1.setBackground(new Color(display,0,200,0));
new Label(shell,SWT.CENTER).setText("software college of neu");
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
|
程序的一些解释:
1. Display类:该类是SWT的基础类,它负责应用程序和本地操作系统之间建立交互。Display类是从Decive继承而来。
Display继承关系图
2. Shell类:该类是显示在桌面上的窗口,可以使顶级窗口(Top Level Shells)或者是对话框窗口(Secondary Or Dialog Shells)
3. 设置消息循环进行监听,以便监听到界面的操作:
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
|
二. SWT基础
2.1 SWT基本组件
2.1.1关于按钮Button
类型
|
特点
|
创建代码举例
|
普通
|
呈突出状
|
Button bt = new Button(shell,SWT.PUSH)
|
切换
|
单击后保持按下状态,再次单击时恢复。
|
Button bt = new Button(shell,SWT.TOGGLE)
|
箭头
|
按钮带有小箭头
|
Button bt = new Button(shell , SWT.ARROW|SWT.UP)向上的箭头
|
单选
|
同一组只有一个选中
|
Group group = new Group(shell , SWT.SHADOW_ETCHED_OUT)
group.setLayout(new FillLayout(SWT.VERTICAL)
Button bt1 = new Button(group , SWT.RADIO|SWT.LEFT)
Button bt2 = new Button(group, SWT.RADIO|SWT.RIGHT)
bt1.setSelection(true)表示选定该按钮
|
多选
|
同时可选几个按钮
|
Group group = new Group(shell , SWT.SHADOW_ETCHED_OUT)
group.setLayout(new FillLayout(SWT.VERTICAL)
Button bt1 = new Button(group , SWT.CHECK|SWT.LEFT)
Button bt2 = newButton(group, SWT.CHECK|SWT.RIGHT)
bt1.setSelection(true)表示选定该按钮
|
2.1.2文本框Text
文本框是一个比较常用的组件,文本狂本身就支持复制,粘贴,删除等基本的操作。因此这些常用的基本操作不用我们再去设计。
1.文本框的比较特殊的样式
样式常量
|
描述
|
SWT.READ_ONLY
|
只读文本框
|
SWT.PASSWORD
|
输入密码框
|
SWT.MULTI
|
可以输入多行的文本框
|
SWT.WRAP
|
可以输入多行并且自动切换
|
SWT.H_SCROLL
|
带水平滚动条的文本框
|
2.关于文本框的几个操作的方法
设置文字的方向
|
setOrientation(int orientation)
|
SWT.RIGHT_TO_LEFT
则从右往左填充
|
设置文本输入字符的格式
|
setEchoChar(char echo)
|
Example:setEchoChar(“*”),输入时则显示“*”
|
设置Tab退格的字符数
|
setTabs(int tabs)
|
tabs是多大就退几格
|
全选
|
selectAll()
|
|
取消所有选择
|
clearSelection()
|
|
将所选的字符复制到剪贴板
|
copy()
|
|
将所选的字符剪切到剪贴板
|
cut()
|
|
将剪贴板上的字符粘贴到文本框
|
paste()
|
|
2.2面板容器类
2.2.1自定义选项卡CTabFolder
自定义选项卡比TabFolder类的功能强大,我们可以给他添加一些最大化最小化的按钮,可以做出仿eclipse编辑区的选项卡;
①. 带有关闭的选项卡;初始化时将风格设置为SWT.CLOSE即可;
CTabFolder tabFolder = new CTabFolder(shell,SWT.CLOSE);
②. 带有最大化最小化按钮
tabFolder.setMaxmizeVisible(true);//显示最大化按钮
tabFolder.setMininizeVisible(true);//显示最小化按钮
|
③. 设置选项卡(选中状态标签)的背景和颜色
l 单一的前景色和背景色
tabFolder.setSelectionForeground(display.getSystemColor(SWT.COLOR_WHITE));
tabFolder.setSelectionBackground(display.getSystemColor(SWT.COLOR_BLUE));
|
l 渐变的背景色
设置渐变背景的方法是setSelectionBackground(Color[] color, int[] percents)或setSelectionBackground(Color[] color, int[] percents, Boolean vertical),第二个方法的vertical表示是否垂直渐变;
Color[] color = new Color[4];
color[0] = display.getSystemColor(SWT.COLOR_DARK_BLUE);
color[1] = display.getSystemColor(SWT.COLOR_BLUE);
color[2] = display.getSystemColor(SWT.COLOR_WHITE);
color[3] = display.getSystemColor(SWT.COLOR_WHITE);
int[] intArray = newint[]{25, 50, 100};
tabFolder.setSelectionBackground(color,intArray);
|
l 设置背景图片,setSelectionBackground(Image image);
④. 最大化最小化按钮的监听;
添加监听的语句是
tabFolder.addCTabFolder2Listener(new CTabFolder2Adapter(){});
设置最大化,最小化和还原,实现以下方法
publicvoid mimimize(CTabFolderEvent e){}
publicvoid maximize(CTabFolderEvent e){}
publicvoid restore(CTabFolderEvent e){}
以下是最下化方法的代码
tabFolder.setMinimized(true);//设置选项卡为最小化,决定了右上角的按钮
tabFolder.setLayoutData(new GridData(SWT.FILL, SET.FILL, true, false));//改变布局,呈现最小化状态
shell.layout(true);//刷新布局,否则新的布局不能呈现出来
|
⑤. CTabFolder还有许多有用的方法,以上说的基本上可以构建出仿eclipse的选项卡了
2.2.2滚动面板ScrolledComposite
对于滚动面板ScrolledComposite,看起来好像很好用,如果对于布局确定的面板来说,实现滚动效果确实比较简单,但对于一个没有确定布局的面板(比如一个可以往上面随意家图形的画布),那实现起来就要费一些心思。这里我们要实现一个没有确定布局的,可以随意添加图形的而且要求可以无限变大的面板。
l 首先,我们新建一个ScrolledComposite sc,然后将我们的画布canvas设为ScrolldeComposite的内容sc.setContent(canvas);为了让滚动条显示出来,我们可以canvas设置一个适当的大小
l 接下来最关键的是如何改变面板的大小,在改变大小之前,我们首先要判断出面板是否到了边界,因为这时才需要使面板的大小增大
(sc.getVerticalBar().getSize().y+sc.getVerticalBar().getSelection())
==sc.getVerticalBar().getMaximum())
如果等式成立就说明面板已经到了边界
l 这时只要在监听里重新设置面板的大小就可以了
2.2.3分割窗框SashForm
关于分割框的基本知识这里就不再介绍了,在这里主要讲述使用分割框和选项卡实现最大化和还原,其实这也很简单,只要用了setMaximizedControl(Control control)这个方法就可以了。
在我们点击选项卡的最大化时:
form.setMaximizedControl(folder);
|
在点击还原是只要form.setMaximizedControl(null);整个面板就会还原到初始的比例