基于SWT的Sash和FormLayout的自定义分隔窗体

来源:互联网 发布:php 数组弹出第一个 编辑:程序博客网 时间:2024/05/17 01:27

基于SWT的Sash和FormLayout的自定义分隔窗体

本文不是对SWT做深入的研究,只是一些小技巧的介绍,通过构建一个自定义的分隔窗体来熟悉一些SWT的Widget和Layout。

使用过Swing的朋友们应该知道,在Swing里有一种分隔窗体叫JSplitPane,可以提供左右或者上下两个分隔窗体,并且可以通过中间的拖动条的拖拽来实现两个窗体大小的调整,拖动条还提供直接最大化某个窗体或者直接平分两个窗体的按钮。而在SWT里对应的有SashForm这个组件,同样可以实现左右拖拽,但并没有提供那些快捷键按钮,想通过继承SashForm来实现这个功能并不好做,那么这里我使用的是SWT的Sash和FormLayout的配合来实现一个类似于Swing JSplitPane的分割窗体。

先来看看我们最终实现的效果图:

  

好,那么我们就一起开始来设计这个分割窗体。首先做一下简单的分析:

1. 我们需要两个Composite来存放我们不同窗体的组件

2. 我们需要一个可以拖拽的拖杠,使用SWT提供的Sash组件来实现;

3. 一个存放按钮的的Composite,并且在拖拽过程中要保持与拖杠同步;

4. 提供左右分隔和上下分隔两种模式。

一切从拖拽开始,那么什么是Sash呢?SWT的文档上是这么说的:

Instances of the receiver represent a selectable user interface object that allows the user to drag a rubber banded outline of the sash within the parent control.

Styles:
HORIZONTAL, VERTICAL, SMOOTH
Events:
Selection

就是说Sash能够在其Parent容器里进行拖拽并产生条纹线的回馈,当然还包括Selection事件。那么我们就可以这么设计,我们接收Sash的Selection事件,并相应的调整左右或者上下窗体的大小即可实现我们的需求。那么如何计算两个窗体的大小呢?这里最好就是从布局组件入手,使用SWT强大的FormLayout可以灵活的实现丰富的布局效果。

为什么使用FormLayout呢?它又有哪些功能?这里我只做简单的介绍,详细的大家可以参阅SWT的文档或其它网络文档。使用FormLayout和对应的FormData可以实现其布局中组件间的相对定位以及相对的偏移量,相对距离及偏移量是通过定义FormData的top/bottom/left/right决定的,其定义使用的类是FormAttachment。有了FormLayout和对应的FormData这就为我们Sash拖动后窗体的布局计算提供了基础,那么如何设置我们SplitPane中各个组件的FormData呢?如下图分析:

① 左边窗体,与父容器的左边距离为0,右边参照SashBar
② 右边窗体,与父容器的右边距离为0,左边参照SashBar
③ Sash,即我们的拖杠,左边参照SashBar,并且向左偏移5像素(这样Sash才会叠在SashBar上面),右边无参照,宽度定死为3
④ SashBar,即存放按钮的Composite,左右均无参照(左右的参照距离应该是在接收Sash的Selection事件时动态决定),与父容器的顶部距离为总高度的50%,并且向上偏移半个SashBar的高度,这样就能保证SashBar在垂直上居中 

定义好布局后接下来要做的就是对Sash的Selection事件反馈作用到SashBar的FormData上,因为SashBar是其它所有组件的参照中心,大家都是围绕它来布局的。

原文 :http://www.cnblogs.com/louischx/archive/2008/10/25/1319501.html

0 0
原创粉丝点击