kooyee ‘s blog

开源软件, 众人努力的结晶, 全人类的共同财富
posts - 103, comments - 55, trackbacks - 0, articles - 66
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

『SWT』SWT/JFace的基本介绍

Posted on 2008-06-09 18:35 kooyee 阅读(2111) 评论(0)  编辑  收藏 所属分类: GUI骨衣
SWT/JFace的基本介绍

1.1 Face与其他图形界面设计工具的比较

Java图形界面实现方式有很多,比如AWTSWINGSWT等。AWTSWING不论是在速度上还是美观上都有很大的不足;对于比较庞大而复杂的系统,用AWTSWING相很难实现,因为运行的速度会相当的慢。SWT直接使用操作系统提供的本地图形接口,具备本地化的Look & Feel,效率高且美观。因此,本项目选择SWT作为图形界面开发基础工具包。

2-1SWT原理图,图2-2JFace原理图

2-1

                  2-2

 

SWTWin32API简单的包装了一下,系统在SWT这一层调用的方法、传递的参数被原封不动的代理到了Win32层。这是SWT的核心思想。SWT有一个很重要的设计原则,那就是,SWTAPI一对一的封装OSAPI,完全忠实于操作系统的API实现的行为,如果有bug,那也是OSbug,它不会尝试去“纠正”操作系统,因为那样会潜在的破坏本地化的一些行为。忠实于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);整个面板就会还原到初始的比例 

只有注册用户登录后才能发表评论。


网站导航: