鹰翔宇空

学习和生活

BlogJava 首页 新随笔 联系 聚合 管理
  110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks


1.   SWT

SWT 是由IBM所提出的,一个用于做用户界面的包。她与SunSwing具有很多的相似之处,因此如果掌握了Swing,那么要学习SWT将是非常简单的。SWTEclipse中得到了很大的使用,但是,在Eclipse当中更多情况下,我们使用的是对SWT再进行了一层封装的JFACE包。因此,如果想进行Eclipse的插件开发,我们需要先掌握SWTJFACE

 

2.   从例子开始

a)        代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test1 {

public static void main(String[] args) {

Display d = new Display();

Shell s = new Shell(d);

s.setText("Test");

Label l = new Label(s, SWT.NONE);

l.setText("Hello World");

l.pack();

s.pack();

s.open();

while (!s.isDisposed()) {

if (!d.readAndDispatch()) {

d.sleep();

}

}

d.dispose();

}

}

 

a)        运行图:

 

b)        说明:

从上述程序,我们可以大约的得到一些SWTSwing不一样的地方:

1.   当我们需要实例化一个控件时,我们需要在构造函数中提供父控件的引用。

2.   通过构造函数,我们不需要进行显式的add()操作,来组织控件树。

3.   我们需要手动的启动消息循环(while部分)。

4.   程序结束的时候,我们需要手工的对资源进行释放。

 

 

3.   控件:

a)        Label

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test1 {

public Test1() {

init();

}

private void init() {

Label b1 = new Label(s, SWT.NONE);

b1.setText("Label 1");

b1.setBackground(new Color(d, 0, 0, 255));

 

Label b2 = new Label(s, SWT.BORDER | SWT.CENTER);

b2.setText("Label 2");

 

Label b3 = new Label(s, SWT.WRAP);

b3.setText("Label 3");

 

Label b4 = new Label(s, SWT.SEPARATOR | SWT.HORIZONTAL);

}

public static void main(String[] args) {

Test1 t = new Test1();

}

}

 

                   ii.              运行图:

 

                iii.              说明:

1.        Label 实例化的时候需要提供一个Style参数,从后面的例子可以看到,这个Style参数在SWT当中被广泛使用,通过Style参数的使用,我们可以比在Swing当中接触到更少的子类。

2.        Label 可以使用的Style参数有:BORDER CENTER LEFT RIGHT WRAPSEPARATORBORDER用于为控件添加边框;CENTERLEFTRIGHT用于Label内容的对齐;WRAP用于当文本内容超出Label一行的最大长度时,进行自动换行。当使用SEPARATOR时,可以配合HORIZONTALVERTICALSHADOW_IN SHADOW_OUTSHADOW_NONE使用。

b)        Text

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test2 {

    public Test2() {

        init();

    }

private void init() {

Text t1 = new Text(s, SWT.NONE);

 

/**

* 相当于密码输入框

*/

Text t2 = new Text(s, SWT.BORDER);

t2.setEchoChar('*');

t2.setTextLimit(10); // 限制最大输入字符数为10

 

/**

* 不能换行,相当于TextField

*/

Text t3 = new Text(s, SWT.SINGLE);

t3.setText("Hello World");

 

/**

* 支持换行

*/

Text t4 = new Text(s, SWT.MULTI);

t4.setText("Hello World");

 

/**

* 相当于TextArea

*/

Text t5 = new Text(s, SWT.H_SCROLL | SWT.V_SCROLL);

 

/**

* 支持自动换行

*/

Text t6 = new Text(s, SWT.WRAP);

}

public static void main(String[] args) {

Test2 t = new Test2();

}

}

 

                   ii.              运行图:

 

                iii.              说明:

1.        Text 可以使用的Style参数有:BORDERH_SCROLLV_SCROLLMULTISINGLEREAD_ONLYWRAPBORDER用于添加边框;H_SCROLLV_SCROLL用于提供滚动,当使用滚动时即表明Text可以添加多行内容;MULTISINGLE用于表示Text的内容时多行还是单行;READ_ONLY用于表示Text为止读。WRAP用于当文本内容超出Text一行的长度时,进行自动换行。

 

c)        Button

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test3 {

public Test3() {

init();

}

private void init() {

/**

* 普通按钮

*/

Button b1 = new Button(s, SWT.PUSH | SWT.LEFT);

b1.setText("Button 1");

 

/**

* 单选按钮

*/

Button b2 = new Button(s, SWT.CHECK);

b2.setText("Button 2");

 

/**

* Radio 按钮

*/

Button b3 = new Button(s, SWT.RADIO);

b3.setText("Button 3");

/**

* 箭头按钮

*/

Button b4 = new Button(s, SWT.ARROW | SWT.BORDER);

b4.setText("Button 4");

 

/**

* Toggle 按钮

*/

Button b5 = new Button(s, SWT.TOGGLE);

b5.setText("Button 5");

}

}

 

                   ii.              运行图:

 

                iii.              说明:

1.        Button 可以使用的Style有:PUSHCHECKRADIOTOGGLEARROWFLAT, BORDER, LEFT, RIGHTCENTER。其中,前5个用于改变按钮的类别;后5个用于改变按钮的外观。

2.        由于SWT没有提供类似于Swing当中的ButtonGroup的概念,因此,我们需要以手工的方式来处理按钮间的互斥选择问题。

 

d)        List

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test4 {

private void init() {

/**

* 多选

*/

List l1 = new List(s, SWT.MULTI | SWT.H_SCROLL | SWT.BORDER);

l1.add("Item 1");

l1.add("Item 2");

l1.add("Item 3");

 

/**

* 单选

*/

List l2 = new List(s, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);

l2.setItems(new String[] { "Item 1", "Item 2", "Item 3" });

}

}

 

                   ii.              运行图:

 

                iii.              说明:

1.        List 可以使用的Style有:BORDERH_SCROLLV_SCROLLSINGLEMULTISINGLEMULTI用于表示单选和多选。

 

e)        Combo

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test5 {

private Combo c2 = null;

public Test5() {

init();

}

private void init() {

/**

* 没有编辑框

*/

Combo c1 = new Combo(s, SWT.DROP_DOWN | SWT.READ_ONLY);

c1.setItems(new String[] { "Item 1", "Item 2", "Item 3" });

 

Combo c2 = new Combo(s, SWT.SIMPLE | SWT.BORDER);

c2.setItems(new String[] { "Item 1", "Item 2", "Item 3" }); 

     /**

     * 没有选项

     */

Combo c3 = new Combo(s, SWT.DROP_DOWN);

}

}

 

                   ii.              运行图:

 

                iii.              说明:

1.        Combo 可以使用的Style有:BORDERDROP_DOWNREAD_ONLYSIMPLEDROP_DOWN表示只提供下拉框;SIMPLE表示既有下拉框又有编辑框。

 

f)        Composite

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test6 {

private void init() {

/**

* Composite 就是一个容器,他类似于JPanel

*/

Composite c = new Composite(s, SWT.BORDER);

c.setBackground(new Color(d, 255, 0, 0));

Label l = new Label(c, SWT.BORDER);

l.setText("Hello World");

}

}

 

 

 

                   ii.              运行图:

 

                iii.              说明:

1.        Composite 是一个容器,相当于Swing当中的JPanel

2.        Composite 可以使用的Style有:BORDERH_SCROLLV_SCROLL

 

g)        Group

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test7 {

private void init() {

Group g1 = new Group(s, SWT.BORDER | SWT.SHADOW_ETCHED_IN);

g1.setText("Group 1");

g1.setBackground(new Color(d, 255, 0, 0));

Button b = new Button(g1, SWT.PUSH);

b.setText("Button");

}

}

 

                   ii.              运行图:

 

                iii.              说明:

1.        Group Composite的一个子类,所以他也是一个容器,不过它与Composite的区别就是,她比Composite多加了一个框。

2.        Group 可以使用的Style有:BORDERSHADOW_ETCHED_INSHADOW_ETCHED_OUTSHADOW_INSHADOW_OUTSHADOW_NONE

 

 

 

4.   事件监听

a)        SelectionListener

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test1 {

private void init() {

Button b = new Button(s, SWT.PUSH);

b.setText("Button");

 

b.addSelectionListener(new SelectionAdapter() {

@Override public void widgetSelected(SelectionEvent e) {

System.out.println("Button was pressed");

}

});

}

}

 

                   ii.              说明:

1.        SelectionListener 的作用与Swing当中的ActionListener同。

 

b)        KeyListener

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test2 {

private void init() {

Text t = new Text(s, SWT.BORDER);

t.addKeyListener(new KeyAdapter() {

@Override public void keyPressed(KeyEvent e) {

if (e.character == 'a') {

System.out.println("a is forbidden");

// 通过doit属性,可以禁止输入的字符

e.doit = false;

} else {

System.out.println("Pressed " + e.character);

}

}

});

}

}

 

                   ii.              说明:

1.        SWT 没有为按键提供与Swing中类似的平台无关的VK码。

2.        我们可以通过KeyEvent中的doit属性,来对输入框的内容进行约束。这是比Swing要方便的地方,如果我们想要在Swing当中完成相同的操作的话,可能需要获取TextField中对应的module对象,并进行操作。

 

c)        MouseListener MouseMoveListenerMouseTrackListener

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test3 {

private void init() {

Button b1 = new Button(s, SWT.PUSH | SWT.BORDER);

b1.setText("Button 1");

 

b1.addMouseListener(new MouseAdapter() {

@Override public void mouseDown(MouseEvent e) {

System.out.println("Pressed at (" + e.x + "," + e.y + ")");

}

});

 

Button b2 = new Button(s, SWT.PUSH | SWT.BORDER);

b2.setText("Button 2");

b2.addMouseMoveListener(new MouseMoveListener() {

public void mouseMove(MouseEvent e) {

System.out.println("Pressed at (" + e.x + "," + e.y + ")");

}

});

 

Button b3 = new Button(s, SWT.PUSH | SWT.BORDER);

b3.setText("Button 3");

b3.addMouseTrackListener(new MouseTrackAdapter() {

@Override public void mouseHover(MouseEvent e) {

System.out.println("Pressed at (" + e.x + "," + e.y + ")");

}

});

}

}

 

                   ii.              说明:

1.        SWT 增加了MouseTrackerListener,用于监听鼠标进入,离开和在控件上停留的事件。

 

d)        FocusListener

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test5 {

    

private void init() {

Button[] bs = new Button[3];

int i = 0;

for (Button b : bs) {

b = new Button(s, SWT.PUSH);

b.setText("Button " + i);

b.addFocusListener(new FocusAdapter() {

public void focusGained(FocusEvent e) {

System.out.println(e.getSource() + " Gains Focus");

}

});

b.addTraverseListener(new TraverseListener() {

public void keyTraversed(TraverseEvent e) {

if (e.detail == SWT.TRAVERSE_TAB_NEXT) {

System.out.println("Don't use Tab to Traverse.");

e.doit = false;

}

}

});

i++;

}

}

}

                   ii.              说明:

1.        FocusListener 在控件获取到焦点之后得到通知。

2.        TraverseListener 在控件获得焦点之前得到通知,通过TraverseEventdetail值可以得知控件是通过什么方式获得焦点,而通过doit值,可以限制是否让控件获取该焦点。

 

5.   高级控件

a)        Table

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test1 {

private Table table = null;

private void init() {

table = new Table(s, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL

                | SWT.V_SCROLL | SWT.FULL_SELECTION);

table.setHeaderVisible(true);

table.setLinesVisible(true);

 

TableColumn name = new TableColumn(table, SWT.CENTER);

name.setText("Name");

name.setWidth(100);

 

TableColumn sex = new TableColumn(table, SWT.CENTER);

sex.setText("Sex");

sex.setWidth(50);

 

TableColumn age = new TableColumn(table, SWT.CENTER);

age.setText("Age");

age.setWidth(50);

 

TableItem i1 = new TableItem(table, SWT.NONE);

i1.setText(new String[] { "nick", "m", "24" });

 

TableItem i2 = new TableItem(table, SWT.NONE);

i2.setText(new String[] { "cen", "m", "24" });

 

table.addSelectionListener(new SelectionAdapter() {

public void widgetSelected(SelectionEvent e) {

TableItem ti = table.getSelection()[0];

for (int i = 0; i < 3; i++)

System.out.print(ti.getText(i) + "\t");

System.out.println();

}

});

}

}

 

                   ii.              运行图:

 

                iii.              说明:

1.        Table 可以使用的Style值:BORDERH_SCROLLV_SCROLLSINGLEMULTICHECKFULL_SELECTIONHIDE_SELECTION。其中SINGLEMULTI用于支持单选和多选;CHECK用于为第一列增加一个CheckBoxFULL_SELECTION用于当选择某一列时,可以把该项所在的行全部选中。HIDE_SELECTION用于禁止表格的项被选中。

 

                   iv.              结构图:

Shell

Table

TableColumn

TableItem

 

b)        TabFolder

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test2 {

private void init() {

TabFolder tf = new TabFolder(s, SWT.BORDER);

Composite c1 = new Composite(tf, SWT.BORDER);

c1.setLayout(new RowLayout());

Label b1 = new Label(c1, SWT.BORDER);

b1.setText("Label 1");

 

Composite c2 = new Composite(tf, SWT.BORDER);

c2.setLayout(new RowLayout());

Label b2 = new Label(c2, SWT.BORDER);

b2.setText("Label 2");

 

TabItem page1 = new TabItem(tf, SWT.NONE);

page1.setText("Page 1");

page1.setControl(c1);

 

TabItem page2 = new TabItem(tf, SWT.NONE);

page2.setText("Page 2");

page2.setControl(c2);

}

}

 

                   ii.              运行图:

 

                iii.              说明:

1.        Tab 可以使用的Style有:BORDER

 

                   iv.              结构图:

control

 

Shell

TabFolder

TabItem

Control

 

 

c)        Slider ScaleProgressBar

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test3 {

private Slider slider = null;

private Scale scale = null;

private ProgressBar pb = null;

private void init() {

slider = new Slider(s, SWT.HORIZONTAL);

slider.setMinimum(0);

slider.setMaximum(100);

slider.addSelectionListener(new SelectionAdapter() {

@Override public void widgetSelected(SelectionEvent e) {

System.out.println("slider is:"+ slider.getSelection());

}

});

scale = new Scale(s, SWT.HORIZONTAL);

scale.setMinimum(0);

scale.setMaximum(100);

scale.addSelectionListener(new SelectionAdapter() {

@Override public void widgetSelected(SelectionEvent e) {

System.out.println("scale is:"+ scale.getSelection());

}

});

pb = new ProgressBar(s, SWT.HORIZONTAL | SWT.SMOOTH);

pb.setMinimum(0);

pb.setMaximum(100);

pb.setSelection(75);

}

}

                   ii.              运行图:

 

                iii.              说明:

1.        Slider ScaleProgressBar可以使用的StyleBORDERHORIZONTALVERTICAL

 

d)        菜单:

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test4 {

private void init() {

Menu bar = new Menu(s, SWT.BAR);

s.setMenuBar(bar);

 

MenuItem fMenu = new MenuItem(bar, SWT.CASCADE);

fMenu.setText("File");

Menu fileMenu = new Menu(s, SWT.DROP_DOWN);

fMenu.setMenu(fileMenu);

 

MenuItem miOpen = new MenuItem(fileMenu, SWT.PUSH);

miOpen.setText("&Open\tCtrl+o");

miOpen.setAccelerator(SWT.CTRL + 'o');

MenuItem miClose = new MenuItem(fileMenu, SWT.PUSH);

miClose.setText("&Close");

 

MenuItem eMenu = new MenuItem(bar, SWT.CASCADE);

eMenu.setText("Edit");

Menu editMenu = new Menu(s, SWT.DROP_DOWN);

eMenu.setMenu(editMenu);

 

MenuItem miCopy = new MenuItem(editMenu, SWT.CHECK);

miCopy.setText("&Copy");

MenuItem miPaste = new MenuItem(editMenu, SWT.RADIO);

miPaste.setText("&Paste");

 

miOpen.addSelectionListener(new SelectionAdapter() {

@Override public void widgetSelected(SelectionEvent e) {

System.out.println("Open Selected");

}

});

 

Button b = new Button(s, SWT.PUSH);

b.setText("Button");

/**

* 弹出式菜单

* */

Menu mPopup = new Menu(s, SWT.POP_UP);

MenuItem miFile = new MenuItem(mPopup, SWT.CASCADE);

miFile.setText("File");

 

Menu pfileMenu = new Menu(s, SWT.DROP_DOWN);

miFile.setMenu(pfileMenu);

 

MenuItem pmiOpen = new MenuItem(pfileMenu, SWT.PUSH);

pmiOpen.setText("Open");

pmiOpen.addSelectionListener(new SelectionAdapter() {

@Override public void widgetSelected(SelectionEvent e) {

System.out.println("Open Selected");

}

});

 

MenuItem pmiCopy = new MenuItem(mPopup, SWT.PUSH);

pmiCopy.setText("Copy");

b.setMenu(mPopup);

}

}

                   ii.              运行图:

 

 

                iii.              说明:

1.        与菜单相关的类只有MenuMenuItem。而为了组成整个菜单栏,我们需要通过不同的Style来标识不同的控件。

2.        MenuStyleBar时,表示这个Menu是个MenuBar

3.        如果需要新建一个菜单,我们需要:

MenuItem fMenu = new MenuItem(bar, SWT.CASCADE);

fMenu.setText("File");

Menu fileMenu = new Menu(s, SWT.DROP_DOWN);

fMenu.setMenu(fileMenu);

其中,前两行是为MenuBar添加了一个StyleCASCADEMenuItem。第三行是新建一个菜单,他的StyleDROP_DOWN,表示为一个下来菜单。然后第4行,是把菜单项和这个菜单关联起来,这于待会提到的上下文菜单类似,即把fileMenu看作是fMenu的弹出菜单。

4.        如果需要建立一个弹出式菜单,我们需要新建一个StylePOP_UP的菜单,他的作用与2中提到的MenuBar类似,后续的工作都是基于这个新建的POP_UP菜单继续的。

5.        MenuItem 可以使用的Style有:PUSHCHECKRADIOSEPARATORCASCADE

 

                   iv.              结构图:

Shell

Menu

MenuItem

 

e)        树:

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test5 {

private Tree tree = null;

private void init() {

tree = new Tree(s, SWT.SINGLE | SWT.BORDER | SWT.CHECK);

tree.setSize(300, 300);

 

TreeItem tiC = new TreeItem(tree, SWT.NONE);

tiC.setText("C");

TreeItem tiD = new TreeItem(tree, SWT.NONE);

tiD.setText("D");

TreeItem tiPro = new TreeItem(tiC, SWT.NONE);

tiPro.setText("Program File");

TreeItem tiJava = new TreeItem(tiD, SWT.NONE);

tiJava.setText("Java");

 

tree.addSelectionListener(new SelectionAdapter() {

@Override public void widgetSelected(SelectionEvent e) {

TreeItem[] tis = tree.getSelection();

for (TreeItem ti : tis) {

System.out.println(ti.getText() + " was selected "

                            + ti.getChecked());

}

}

});

}

}

 

                   ii.              运行图:

                iii.              说明:

1.        Tree 可以使用的Style有:MULTISINGLECHECK。其中MULTISINGLE表示单选和多选;CHECK是为每个树节点添加复选框。

 

                   iv.              结构图:

Shell

Tree

TreeItem

 

 

 

 

 

 

 

f)        ToolBar

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test6 {

private void init() {

ToolBar tb = new ToolBar(s, SWT.BORDER | SWT.HORIZONTAL);

ToolItem tiOpen = new ToolItem(tb, SWT.PUSH);

tiOpen.setText("Open");

ToolItem tiClose = new ToolItem(tb, SWT.PUSH);

tiClose.setText("Close");

 

Group g = new Group(s, SWT.BORDER);

g.setText("Group");

}

}

 

                   ii.              运行图:

 

                iii.              说明:

                   iv.              结构图:

Shell

ToolBar

ToolItem

 

g)        CoolBar

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test7 {

private void init() {

CoolBar cb = new CoolBar(s, SWT.BORDER);

cb.setLayout(new RowLayout());

CoolItem ci1 = new CoolItem(cb, SWT.BORDER);

CoolItem ci2 = new CoolItem(cb, SWT.BORDER);

Button b = new Button(cb, SWT.PUSH);

b.setText("Button");

ToolBar tb = new ToolBar(cb, SWT.BORDER | SWT.HORIZONTAL);

ToolItem tiOpen = new ToolItem(tb, SWT.PUSH);

tiOpen.setText("Open");

ToolItem tiClose = new ToolItem(tb, SWT.CHECK);

tiClose.setText("Close");

ci1.setControl(b);

ci2.setControl(tb);

}

}

 

                   ii.              运行图:

 

                iii.              说明:

                   iv.              结构图:

control

 

Shell

CoolBar

CoolItem

Control

h)        消息框

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test9 {

private void init() {

MessageBox box = new MessageBox(s, SWT.ICON_QUESTION | SWT.YES | SWT.NO);

box.setMessage("Are you a student?");

box.setText("Question");

int res = box.open();

switch (res) {

case SWT.YES:System.out.println("Select Yes");

break;

case SWT.NO:System.out.println("Select No");

break;

}

 

ColorDialog cd = new ColorDialog(s);

cd.setText("Selected Color");

cd.setRGB(new RGB(255, 0, 0));

RGB rgb = cd.open();

System.out.println("Select color is " + rgb);

 

DirectoryDialog dd = new DirectoryDialog(s);

dd.setText("Selected Dir");

dd.setFilterPath("D:/");

String path = dd.open();

System.out.println("Select path is " + path);

 

FileDialog fd = new FileDialog(s, SWT.OPEN);

fd.setText("Select File");

fd.setFilterPath("D:/");

fd.setFileName("*.java");

String file = fd.open();

System.out.println("Select path is " + file);

 

FontDialog fod = new FontDialog(s);

FontData fontd = new FontData(" 新宋体", 9, SWT.NONE);

fod.setText("Select Font");

fod.setFontList(new FontData[] { fontd });

fod.setRGB(new RGB(0, 0, 0));

FontData font = fod.open();

System.out.println("Select font is " + font);

 

PrintDialog pd = new PrintDialog(s);

PrinterData pdata = pd.open();

System.out.println("Print data is " + pdata);

}

}

 

                   ii.              运行图:

MessageBox

 

ColorDialog

DirectoryDialog

 

FileDialog

 

FontDialog

 

PrintDialog

                iii.              说明:

                   iv.              结构图:

 

6.   绘图:

a)        代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test8 {

private Canvas canvas = null;

private void init() {

canvas = new Canvas(s, SWT.BORDER);

canvas.setSize(200, 200);

s.pack();

s.open();

 

GC graphic = new GC(canvas);

paint(graphic, d);

graphic.dispose();

 

canvas.addPaintListener(new PaintListener() {

public void paintControl(PaintEvent e) {

paint(e.gc, e.display);

}

});

}

 

private void paint(GC g, Display d) {

Color red = d.getSystemColor(SWT.COLOR_RED);

Font f = new Font(d, " 新宋体", 9, SWT.NONE);

Image i = new Image(d, "11.jpg");

g.setForeground(red);

g.setFont(f);

g.drawRectangle(0, 0, 80, 80);

g.drawText("Hello World", 20, 20);

g.drawImage(i, 0, 0, i.getBounds().width, i.getBounds().height, 30, 40,40,

40);

i.dispose();

f.dispose();

}

}

 

 

b)        运行图:

 

c)        说明:

                      i.              SWT 提供一个叫做GCGraphicContext)的东西用于绘图,每个控件都可以属于他自己的GC

                   ii.              SWT中,字体,颜色,图片都是重量对象,因此使用完以后,应该进行显式的dispose()操作。

                iii.              由于,我们不能像Swing当中那样,通过子类化的方法,对绘图方法进行重载,因此我们需要通过事件处理的方式进行图像的重绘。

 

7.   布局

a)        FillLayout

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test1 {

private void init() {

Display d = new Display();

Shell s = new Shell();

s.setText("FillLayout");

s.setSize(200, 200);

s.setLayout(new FillLayout());

 

Button[] bs = new Button[4];

for (int i = 0; i < bs.length; i++) {

bs[i] = new Button(s, SWT.PUSH | SWT.BORDER);

bs[i].setText("Button " + i);

}

 

s.pack();

s.open();

while (!s.isDisposed()) {

if (!d.readAndDispatch()) {

d.sleep();

}

}

d.dispose();

}

public static void main(String[] args) {

Test1 t = new Test1();

}

}

 

                   ii.              运行图:

                iii.              说明:

1.        FillLayout 的作用与Swing当中的FlowLayout相似。

 

b)        RowLayout

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test2 {

private void init() {

RowLayout layout = new RowLayout();

layout.wrap = true;

s.setLayout(layout);

 

Button[] bs = new Button[4];

for (int i = 0; i < bs.length; i++) {

bs[i] = new Button(s, SWT.PUSH | SWT.BORDER);

bs[i].setText("Button " + i);

}

}

}

 

                   ii.              运行图:

 

                iii.              说明:

1.        RowLayout 通过wrap属性,可以使得当一行不能容下所有控件时,自动把控件下移到下一行。

 

c)        GridLayout

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test3 {

private void init() {

GridLayout layout = new GridLayout();

layout.numColumns = 2;

s.setLayout(layout);

 

Button[] bs = new Button[4];

for (int i = 0; i < bs.length; i++) {

bs[i] = new Button(s, SWT.PUSH | SWT.BORDER);

bs[i].setText("Button " + i);

}

}

}

 

                   ii.              运行图:

                iii.              说明:

1.        GridLayout 的使用与Swing中的GridLayout类似。

 

d)        FormLayout

                      i.              说明:太复杂了,不管。

8.   其他有趣功能

a)        使用系统托盘(Tray

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test1 {

     private Menu mPop = null;

private void init() {

Display d = new Display();

Shell s = new Shell();

 

Tray tray = d.getSystemTray();

TrayItem ti = new TrayItem(tray, SWT.NONE);

ti.setToolTipText("My Tray");

Image i = new Image(d, "11.jpg");

ti.setImage(i);

i.dispose();

mPop = new Menu(s, SWT.POP_UP);

MenuItem miOpen = new MenuItem(mPop, SWT.NONE);

iOpen.setText("Open");

ti.addListener(SWT.MenuDetect, new Listener() {

public void handleEvent(Event e) {

mPop.setVisible(true);

}

});

ti.addSelectionListener(new SelectionAdapter() {

@Override public void widgetSelected(SelectionEvent e) {

System.out.println("Selected My Tray");

}

});

}

}

 

                   ii.              运行图:

                iii.              说明:

 

 

 

b)        浏览器

                      i.              代码:

/**

 * @author cenyongh@mails.gscas.ac.cn

 */

public class Test4 {

private Browser b = null;

private Text t = null;

private void init() {

Composite c = new Composite(s, SWT.NONE);

c.setLayout(new GridLayout(2, false));

GridData data2 = new GridData();

data2.widthHint = 60;

Label l = new Label(c, SWT.NONE);

l.setText("Address:");

l.setLayoutData(data2);

data2 = new GridData(GridData.FILL_HORIZONTAL);

t = new Text(c, SWT.BORDER);

t.setLayoutData(data2);

 

GridData data = new GridData(GridData.FILL_HORIZONTAL);

c.setLayoutData(data);

 

data = new GridData(GridData.FILL_BOTH);

b = new Browser(s, SWT.BORDER);

b.setLayoutData(data);

t.addKeyListener(new KeyAdapter() {

@Override public void keyPressed(KeyEvent e) {

if (e.character == SWT.CR) {

String url = t.getText();

System.out.println(url);

b.setUrl(url);

}

}

});

}

}

 

 

 

                   ii.              运行图:

 

                iii.              说明:

 

9.   参考资料:

a)        http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html

b)        http://www.cs.umanitoba.ca/~eclipse/


posted on 2007-02-13 11:01 TrampEagle 阅读(1310) 评论(0)  编辑  收藏

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


网站导航: