可视化(番外篇)

  本篇主要介绍如何在SWT下构建一个应用,如何安装SWT Designer并破解已进行SWT的可视化编程,Display以及Shell为何物、有何用,SWT中的常用组件、面板容器以及事件模型等。

  1.可视化环境搭建(SWT Designer):

  (1).首先下载SWT Designer插件包SWT Designer 6.9.5 for Eclipse.rar;

  (2).将解压好的插件包extplugins\swt\eclipse下的features和plugins导入Myeclipse的dropins文件夹下

  SWT Designer 6.9.5 for Eclipse.rar:

  

  Myeclipse的dropins:

  

  (3).下载个注册机,激活全部可视化编程控件的使用(否则只能使用部分控件)

  

  2.Display和Shell

  编写swt程序的步骤,这些步骤是:

  (1).      创建一个Display对象

  (2).      创建一个或者多个Shell对象,你可以认为Shell代表了程序的窗口。

  (3).      在Shell内创建各种部件(widget)

  (4).      对各个部件进行初始化(外观,状态等),同时为各种部件的事件创建监听器(listener)

  (5).      调用Shell对象的open()方法以显示窗体

  (6).      各种事件进行监听并处理,直到程序发出退出消息

  (7).      调用Display对象的dispose()方法以结束程序。

  举例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23


public class TestText {

    public static void main(String[] args) {

        Display display = new Display(); // 创建一个display对象。

        Shell shell = new Shell(display); // shell是程序的主窗体

        shell.setText("文本框示例");

        Text text1 = new Text(shell, SWT.NONE | SWT.BORDER);// 带边框

        text1.setBounds(10107030);

        Text text2 = new Text(shell, SWT.PASSWORD);

        text2.setBounds(90107030);

        Text text3 = new Text(shell, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);

        text3.setBounds(10507070);

        Text text4 = new Text(shell, SWT.WRAP | SWT.V_SCROLL);

        text4.setBounds(90507070);

        shell.pack();

        shell.open();

        while (!shell.isDisposed()) { // 如果主窗体没有关闭则一直循环

            if (!display.readAndDispatch()) { // 如果display不忙

                display.sleep(); // 休眠

            }

        }

        display.dispose(); // 销毁display

    }

}

  Display是SWT的基础类,负责在应用程序和本地操作系统之间建立交互;

  一般一个应用程序只要一个Display即可,其用于启动一个专有的线程,将执行事件循环,并且保持UI线程。

  常用方法:getShells、getPrimaryMonitor等。

  Shell是显示在桌面上的窗口。可以是顶级窗口或是对话框。

  样式的调整通过构造函数进行设置,比如:Shell shell = new Shell(display, SWT.CLOSE)设置成只显示关闭标志的Shell窗口。

  如果要使用多个样式,则需要可以使用“|”运算符进行叠加。

  shell的继承关系:

  

  一个应用程序中可以创建一个或多个Shell

  3.基本组件介绍

  Widget:窗口小部件,Widget类是各种用户界面元素如按钮、列表、数和菜单整个继承体系的父类,抽象类

  ControlsComposites:在SWT中,操作系统控件被定义为抽象类Control的子类,如Button类,Text类等都是Control的子类。

  每个控件都会有自己的父部件,这个父部件可以是Composite类或它的子类,shell也是Composite的子类。

  SWT中控件体系的继承关系为:

  Button:Button分为普通按钮(SWT.PUSH)、单选按钮(SWT.RADIO)、多选按钮(SWT.CHECK)、箭头按钮(SWT.ARROW)和切换按钮(SWT.TOGGLE)

  其样式包括居中、居左等。

  常用方法:setText、getSelect等

  Label:分为文本标签(SWT.NONE)、分割线标签(SWT.SEPARATOR)

  Text(文本框):单行、多行、包裹

  其方法有:选中所有字符selectAll、显示设置的选取文本showSelection、取消所有选择clearSelection、将选取的字符串复制到剪贴板copy等

  List(列表框):SWT.SINGLE(默认只能选中一个)、SWT.MULTI(可以选择多行)

  其方法有:添加选项add(String string)、remove(int index)删除选项

  Combo(组合框):下拉框

  4.面板容器类

  Composite(面板类):composite类继承关系

  

  Group(分组框):分组框是能够显示标题分组的面板类

  TabFolder(选项卡):一个TabFolder与多个TabItem进行对应

  常用方法:获得选项卡数组getItems()、获得当前选中的选项卡getSelection()等

  CTabFolder(自定义选项卡):功能与TabFolder类似,但是样式更加丰富,如:  

1 final CTabFolder tabFolder = newCTabFolder(shell, SWT.CLOSE);

  可以在每个TabItem上显示关闭窗口。

  SashForm(分割窗框):可以将屏幕的区域分成几部分,并可以通过拖动窗框改变窗口的大小。

  CBanner(自动以分割框):SashForm的变体,有3个控件,分别放在窗口的左侧(left)、右侧(right)、底部(bottom)。

  ScrolledComposite(滚动面板)。

  5.布局管理器

  绝对定位:setBounds(int x, int y, int width, int height)

  托管定位:

  FillLayout(充满时布局):组件大小相同,不能调节

  RowLayout(行列式布局):可以调整边距,不会等宽显示组件,可以折行,设置控件大小RowData

  GridLayout(网格式布局):设置单个控件的大小,使用GridData进行定制控件显示

  FormLayout(表格式布局):使用FormData和FormAttachment定制控件显示

  StackLayout(堆栈式布局)

  6.事件模型

  监听器(Listener):接收事件发生的对象,负责处理事件到达后响应事件的代码。监听器对应是一个接口,要响应一个事件就要实现该接口中的方法。监听器类的形式为XXXListener,XXX标示某一类型的监听器。

  Event(事件):当一个事件到达事件监听对象时,要携带一些该事件所附加的一些信息。

  注册监听器

  适配器(这些都是基本概念,不了解的可以百度^_^)

  键盘事件:e.character(表示输入字符的Unicode编码)、e.keyCode(按键所对应的ASCII代码)、e.doit(是否继续执行此事件,设置为false,则取消该事件)、e.stateMask(按下其他键的同时所使用的辅助键)

  键盘事件举例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82


public class TestKeyListener {

    protected Shell shell;

    /**

     * Launch the application

     * @param args

     */

    public static void main(String[] args) {

        try {

            TestKeyListener window = new TestKeyListener();

            window.open();

        catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**

     * Open the window

     */

    public void open() {

        final Display display = Display.getDefault();

        createContents();

        shell.open();

        shell.layout();

        while (!shell.isDisposed()) {

            if (!display.readAndDispatch())

                display.sleep();

        }

    }

    /**

     * Create contents of the window

     */

    protected void createContents() {

        shell = new Shell();

        shell.setSize(500375);

        shell.setText("SWT Application");

        

        Button b = new Button(shell, SWT.PUSH|SWT.WRAP);

        b.setText("有本事,来点我");

        b.setBounds(558030);

        b.addKeyListener(new KeyListener() {

            

            @Override

            public void keyReleased(KeyEvent arg0) {

                // TODO Auto-generated method stub

                

            }

            

            @Override

            public void keyPressed(KeyEvent arg0) {

                Control control = (Control)arg0.widget;

                Rectangle bounds = control.getBounds();

                

                int bits = SWT.SHIFT|SWT.ALT|SWT.CTRL;

                if((arg0.stateMask & bits)!= 0){

                    arg0.doit = false;//取消该事件

                    return ;

                }

                

                if(arg0.keyCode == SWT.ARROW_DOWN)

                    bounds.y++;

                else if(arg0.keyCode == SWT.ARROW_UP)

                    bounds.y--;

                else if(arg0.keyCode == SWT.ARROW_LEFT)

                    bounds.x--;

                else if(arg0.keyCode == SWT.ARROW_RIGHT)

                    bounds.x++;

                

                if(arg0.character == ‘a‘){

                    System.out.println("您按下的是a键");

                }

                

                control.setBounds(bounds);

            }

        });

        

        //

    }

}

  

  鼠标事件:MouseEvent(双击)、MouseMoveEvent(移动)、MouseTrackEvent(跟踪)

  鼠标监听事件举例:  


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132


package com.cntrust.test.events;

import org.eclipse.swt.SWT;

import org.eclipse.swt.events.MouseEvent;

import org.eclipse.swt.events.MouseListener;

import org.eclipse.swt.events.MouseMoveListener;

import org.eclipse.swt.events.MouseTrackListener;

import org.eclipse.swt.graphics.Point;

import org.eclipse.swt.graphics.Rectangle;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Control;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Shell;

public class TestMouseListener {

    protected Shell shell;

    public Button b ;

    public Shell getShell() {

        return shell;

    }

    public void setShell(Shell shell) {

        this.shell = shell;

    }

    public Button getB() {

        return b;

    }

    public void setB(Button b) {

        this.b = b;

    }

    public MyMouseListener getMml() {

        return mml;

    }

    public void setMml(MyMouseListener mml) {

        this.mml = mml;

    }

    public static MyMouseListener mml ;

    /**

     * Launch the application

     * @param args

     */

    public static void main(String[] args) {

        try {

            TestMouseListener window = new TestMouseListener();

            window.open();

        catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**

     * Open the window

     */

    public void open() {

        final Display display = Display.getDefault();

        createContents();

        shell.open();

        shell.layout();

        while (!shell.isDisposed()) {

            if (!display.readAndDispatch())

                display.sleep();

        }

    }

    /**

     * Create contents of the window

     */

    protected void createContents() {

        shell = new Shell();

        shell.setSize(500375);

        shell.setText("SWT Application");

        

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

        b.setBounds(10108030);

        b.setText("来,拖我一把");

        

        mml = new MyMouseListener();

        b.addMouseListener(mml);

        b.addMouseTrackListener(mml);

        //

    }

    public class MyMouseListener implements MouseMoveListener, MouseListener, MouseTrackListener{

        @Override

        public void mouseMove(MouseEvent arg0) {

            Point point = Display.getCurrent().map(b, shell, arg0.x-10, arg0.y-10);

            Rectangle bounds = b.getBounds();

            b.setBounds(point.x, point.y, bounds.width, bounds.height);

            

        }

        @Override

        public void mouseDoubleClick(MouseEvent arg0) {

            

        }

        @Override

        public void mouseDown(MouseEvent arg0) {

            b.addMouseMoveListener(mml);

            

        }

        @Override

        public void mouseUp(MouseEvent arg0) {

            b.removeMouseMoveListener(mml);

        }

        @Override

        public void mouseEnter(MouseEvent arg0) {

            

        }

        @Override

        public void mouseExit(MouseEvent arg0) {

            

        }

        @Override

        public void mouseHover(MouseEvent arg0) {

            

        }

        

    }

}

  如果觉得有用,欢迎点赞,可诚邀可视化朋友加入群227963113^_^

  本文链接《可视化(番外篇)——SWT总结

友情赞助

如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章^^。

    1. 支付宝                          2. 微信

                      

时间: 2024-10-12 09:22:38

可视化(番外篇)的相关文章

可视化(番外篇)——SWT总结

本篇主要介绍如何在SWT下构建一个应用,如何安装SWT Designer并破解已进行SWT的可视化编程,Display以及Shell为何物.有何用,SWT中的常用组件.面板容器以及事件模型等. 1.可视化环境搭建(SWT Designer): (1).首先下载SWT Designer插件包SWT Designer 6.9.5 for Eclipse.rar: (2).将解压好的插件包extplugins\swt\eclipse下的features和plugins导入Myeclipse的dropi

(apache+tomcat集群+memcached番外篇)单台tomcat的session信息的2种持久化方式

为什么要实现搭建tomcat集群环境呢?主要因为单个tomcat无论从吞吐量和并发数上,会达到一定的极限.如果访问量超过单个tomcat的承受能力的话,tomcat一般要么拒绝提供服务,要么直接宕掉.所以,必须要依靠tomcat集群技术.举个最简单的例子,拿"送快件"比喻,如果一个人,5分钟送一件,一小时之内,送10个,一个人完全能胜任这项工作.假设现在到了双十一,要求1小时,送100个, 那怎么办?只能安排更多的人加入"送快件"这项工作中来.这其实和集群一个道理.

【喵"的Android之路】【番外篇】有关于null的一些知识点

[喵"的Android之路][番外篇]有关于null的一些知识点 1.首先,到底什么是null? null是Java中的一个关键字,用于表示一个空对象引用,但其本身并不是任何类型也不是属于任何对象.因此,下面的做法是错误的: int a = null; 但: Object obj = null; 是可以的,因为null表示Object类型的一个空对象引用,符合其用意. [注1]引用类型使用null声明对象变量后,无法使用该变量访问对象的成员.例如上述obj对象如果使用obj.toString()

《Mycat学习笔记》 番外篇一.客户端使用latin1字符集,后端MySQL为UTF8字符集,MyCat日志分析。

其实这个番外篇比较无聊——即客户端为lantin字符集,后面MySQL为U8字符集,MyCat在中间到底会起什么作用. 再说下本次验证的环境: Mac OS 10.11.2 MySQL 5.6 MyCat 1.5 OK,开始我们的验证工作. 1) 由于数据库与操作系统已被默认设置为U8编码,计划通过修改Mysql  “character_set_client” 参数调整客户端字符集配置进行验证. 关于MYSQL字符集较全面的介绍,请参考 <mysql_query("set names gb

【喵&quot;的Android之路】【番外篇】关于==和equals

[喵"的Android之路][番外篇]关于==和equals 在实际的编程当中,经常会使用==和equals来判断变量是否相同.但是这两种比较方式也常常让人搞得云里雾里摸不着头脑.下面是我个人做的总结,希望能起到拨云见日的作用. [讲前普及] 请阅读 [喵"的Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符 了解Java基本数据类型和引用数据类型 1."=="运算符 通俗点讲,==运算符比较的是两个变量在栈中的内容是否相同. 以a ==

cocos2dX 番外篇之CCSpriteBatchNode

嗯, 今天我们没事干, 闲的蛋疼, 干脆我们创建精灵玩玩吧, 我随手一打, 我去, 出了一万个精灵, 感觉我就是万能的上帝啊, 一万个( 旁白: 请不要放弃治疗好么), 嘿嘿, 看看一万个精灵是啥样: 看起来很不错啊( 旁白: 等等, 那个帧数怎么下降这么多啊), 额, 竟然被妹纸看出来了, 好吧, 我们进入今天的课程CCSpriteBatchNode 在游戏的某一时刻, 我们可能会大量的绘制某一个精灵( 比如发出的子弹, 搜集的星星之类), 我们都是使用同一张纹理图片创建的, 如果一张一张的进

Linux入门之内核管理番外篇(4)udev入门(1)

Linux入门之内核管理番外篇(4)udev入门(1) 前言 在上篇中的内核模块管理讲解中,最后或多或少会留下一些疑问,那么这些疑问就是内核模块的参数是怎么和对应的硬件所匹配上的,而硬件又是怎么被内核识别,并且一个个都映射成实际存在的文件,而这些文件之间的关系及作用.当然在最后了解到,这些硬件设备的探测信息是通过一个叫udev的工具来实现的,通过udev中配置的规则可以很有效的识别每一个硬件,并配合sysfs文件系统,将每个探测到的硬件信息导入到/sys目录中,那么与/proc目录对与内核系统信

【转载】数学之美番外篇:平凡而又神奇的贝叶斯方法

数学之美番外篇:平凡而又神奇的贝叶斯方法 BY 刘未鹏 – SEPTEMBER 21, 2008POSTED IN: 数学, 机器学习与人工智能, 计算机科学 概率论只不过是把常识用数学公式表达了出来. ——拉普拉斯 记得读本科的时候,最喜欢到城里的计算机书店里面去闲逛,一逛就是好几个小时:有一次,在书店看到一本书,名叫贝叶斯方法.当时数学系的课程还没有学到概率统计.我心想,一个方法能够专门写出一本书来,肯定很牛逼.后来,我发现当初的那个朴素归纳推理成立了——这果然是个牛逼的方法. ——题记 目

Monkey源码分析番外篇之Android注入事件的三种方法比较

原文:http://www.pocketmagic.net/2012/04/injecting-events-programatically-on-android/#.VEoIoIuUcaV 往下分析monkey事件注入源码之前先了解下在android系统下事件注入的方式,翻译一篇国外文章如下. Method 1: Using internal APIs 方法1:使用内部APIs This approach has its risks, like it is always with intern