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小例子
public class HelloWorld{ public static void 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 = new int[]{25, 50, 100}; tabFolder.setSelectionBackground(color,intArray); |
l 设置背景图片,setSelectionBackground(Image image);
④. 最大化最小化按钮的监听;
添加监听的语句是
tabFolder.addCTabFolder2Listener(new CTabFolder2Adapter(){});
设置最大化,最小化和还原,实现以下方法
public void mimimize(CTabFolderEvent e){}
public void maximize(CTabFolderEvent e){}
public void 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); |
最大化后填充的分割框 |
需要设为最大化的组件 |