WindowBuilder、SWT、jface

GUI(Graphical User Interface,简称 GUI,图形用户界面)是指采用图形方式显示的计算机操作用户界面,与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。

Java GUI主要有两个核心库,分别是AWT(java.awt:Abstract Windows ToolKit(抽象窗口工具包))和Swing(javax.swing:AWT的扩展)
AWT需要调用本地系统方法来实现功能,属重量级控件,
Swing是在AWT的基础上,建立的一套图像界面系统,其中提供了更多的组件,而且完全由Java实现,增强了移植性,属轻量级组件。

WindowBuilder

常见问题

Eclipse左侧项目栏不见了怎么办

window选项-show view选项-project Exlorer选项

如果发现有project Exlorer选项就直接点击该选项,就会自动出现左侧的项目栏了。

如果没有该选项,还需要执行第四步的操作。

window选项-show view选项-other选项-general选项-project Exlorer选项


Esclipse包层级结构设置

要想显示为树形结构,则如下操作:选择package presentation ,然后选择hierarchical, 就是树形结构了。


Eclipse更改项目jdk版本

项目右键->properties->

Esclipse 快捷键

生成变量

【Ctrl + 1】

F:生成全局变量。

L:生成局部变量。


自动导包

ctrl+shift+o:自动导包。自动删除未用到的包。


WindowBuilder安装

插件的安装:https://blog.csdn.net/m0_51086313/article/details/111119825?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168030454016800192219416%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168030454016800192219416&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-111119825-null-null.142^v80^insert_down38,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=windowbuilder&spm=1018.2226.3001.4187

重启Esclipse后,可以File-New-Other,可以看到多出来WindowBuilder目录


项目引入SWT相关jar包

选中项目右键,点击 bulid path - configure build path

点击 库-添加外部jar包

swt.jar下载可以去看这篇文章
https://blog.csdn.net/u013642500/article/details/102791008

添加后效果如下,之后点击 应用并关闭

SWT

SWT:standard widget toolkit 标准小窗口工具箱

用SWT编写的UI无论在响应速度,还是在美观程度上都大大超越了SUN公司提供的AWT和Swing。

  1. SWT采用JNI技术,直接调用操作系统提供的图形组件。

  1. JFace库是SWT的增强库,是SWT的扩展。

  1. SWT提供丰富的窗口小部件(widget)用于创建独立的java应用程序

SWT的底层是由C编写的,通过C直接调用系统层的GUI API,执行效率非常高

SWT入门

SWT的hello world

如果你也使用springboot项目的话,像我这样在src新建lib目录。下面放esclipse相关的包并添加到项目中

public class SWTApplication {protected Shell shell;/*** Launch the application.* @param args*/public static void main(String[] args) {try {SWTApplication window = new SWTApplication();window.open();} catch (Exception e) {e.printStackTrace();}}/*** Open the window.*/public void open() {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(450, 300);shell.setText("SWT Application");//创建一个Label,显示Hello WorldLabel label = new Label(shell, SWT.NONE);label.setBounds(10, 10, 94, 17);label.setText("Hello World");}
}

很可能跟我一样,你会报这个错,莫慌

java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM

意思是不能在64位JVM上加载32位SWT库,说白了就是我的jre是64位,所以我用SWT32的库是不可以,反之32的jre用64位的SWT也是不可以,

解决办法:SWT库改成对应的jre版本,或者jre改成对应版本的SWT库

我是把jdk版本换成32位的了,就可以看到如下效果了


Display类

Display:每一个基于 SWT 的应用程序都会有一个 Display 对象(实例),这个对象用来表示本地操作系统与 SWT 的连接,并在程序末尾释放。

Display 类继承自Device(设备)

创建display

//静态方法创建Display实例
Display display = Display.getDefault();

display释放资源

display.dispose() ;//释放资源
//1.如果你创建了某个资源,那么就有责任释放它
//2.释放父组件资源的同时也释放了其子组件的资源

事件监听器

创建Display实例时会启动一个专有的线程,该线程会执行事件循环。

Display 类维护着注册的事件监听器,通过display.readAndDispatch()方法从操作系统的事件队列中读取事件,并将这些事件传递给相应的事件监听器来完成具体的实现。

    public void open() {Display display = Display.getDefault();createContents();shell.open();shell.layout();while (!shell.isDisposed()) {//操作系统事件队列中有事件处理readAndDispatch()则返回trueif (!display.readAndDispatch()) {//使得ui线程处于等待状态display.sleep();}}}

Shell:顶级窗口

Shell :每一个窗体都有一个 Shell 类,它用来表示可交互的窗口容器。Shell通常有一个作为父控件的 Display,这也是默认设置。

构造方法传入的是 Display 类的对象,将会创建一个顶级的 shell 窗口

Shell()//创建顶级shell 窗口
Shell(Display display) //创建顶级shell 窗口
Shell(Display display, int style)  //创建顶级shell 窗口
Shell(int style)  //创建顶级shell 窗口

默认情况下,shell的style是 SWT.CLOSE|SWT.MIN|SWT.MAX

  • SWT.CLOSE:带有标题栏和关闭按钮

  • SWT.MIN:带有标题栏和最小化按钮,最大化按钮处于没有激活状态

  • SWT.MAX :带有标题栏和最大化按钮,最小化按钮处于没有激活状态

如下:

试着改一下样式

SWT.NO_TRIM
窗口没有“特殊样式”,该窗口没有边框,也没有标题栏。没有“关闭”、“最大化”、“最小化”按钮,不能修改其大小。不能拖拽位置

当还有很多别的其他样式,如:

SWT.ON_TOP样式可以附加到任何样式的窗口上,它唯一的作用就是使窗口永远处于用户桌面的最上层。

Shell:对话框窗口

如下2种Shell的构造方法种传入的是Shell 类的对象,用于创建一个对话框

Shell(Shell parent) //创建一个对话框
Shell(Shell parent, int style)//创建一个对话框
        shell = new Shell();shell.setSize(612, 550);shell.setText("顶级窗口");//对话框Shell dialogShell = new Shell(shell, SWT.DIALOG_TRIM | SWT.PRIMARY_MODAL);// 样式允许Shell组件阻拦对其父亲组件的输入dialogShell.setBackground(SWTResourceManager.getColor(SWT.COLOR_TITLE_BACKGROUND_GRADIENT));dialogShell.setText("对话框窗口");dialogShell.setSize(100, 200);//请求窗口管理器激活 SheldialogShell.open();

Shell事件

shell容器支持5种事件,分别为Activate、Close、Deactivate、Deiconify、lconify

在一个shell窗口成为活动窗口后,会触发Activate事件,Activate事件可以在窗口被创
建出来时触发,也可以在用户的输入焦点落到shell窗口时触发;

当shell窗口被关闭时,触发close事件;

当shell窗口从活动状态变为非活动状态时,会触发Deactivate事件;

当shell窗口从最小化状态恢复时,会触发Deiconify事件;

当shell窗口最小化时,会触发Iconify事件


Shell方法

//打开窗口,并将窗口管理器激活
shell.open()
//返回该窗口的边界值
Rectangle bounds = shell.getBounds();

窗口激活和可见性有啥不一样吗?


SWT简单组件

窗口组件在被创建的时候,必须伴随一个他的上层组件

组件通用方法

//设置组件在容器内的坐标和大小,就是组件在窗体的定位(绝对定位),宽度、高度(以像素为单位)
setBounds(int x ,int y ,int width ,int height)
setText(String string) //设置组件的标签文字
setToolTipText(String,string)方法是常用组件方法,用来为一些组件设置提示性信息。
使用该方法的效果是:当鼠标光标停留在该组件上时,将出现提示性的信息,提供最简单的帮助和容错方法
setEnabled(boolen enable)方法可以对组件设置是否可用状态
button.addSelectionListener(new SelectionAdapter() { 
public void widgetSelected(SelectionEvent e) { …} 
} )
当组件被鼠标、键盘选中时,触发此方法的事件处理程序。

Label标签

Label用于在窗口显示文本数据、图像、以及作为分隔符使用。

标签分隔符样式举例:

//水平分隔符
Label label = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
//垂直分隔符
Label label_1 = new Label(shell, SWT.SEPARATOR | SWT.VERTICAL);
//创建label标签
Label label=new Label(shell,SWT.NONE); 

Label其常用的 API:

setText(String string)  //设置标签文字
//对于分割线标签,使用setText无效
getText()获取标签文字getImage()获取标签上的图像
setImage(Image image)设置标签上的图像。getAlignment()获取文本或图像显示方式(SWT.LEFT、SWT.CENTER、SWT.RIGHT)。
setAlignment(int alignment)设 置 文 本 或 图 像 如 何 在 容 器 上 显 示 。 对 齐 方 式 为  SWT.LEFT、SWT.CENTER、SWT.RIGHT

Label属于静态控件,意思就是用户无法通过点击Label、无法选择Label中的内容、无法修改label的内容

--

此外,Label不能讲图片和文字同时显示。可以使用CLabel,创建一个带图标和文字的标签。。

CLabel clabel=new CLabel(shell,SWT.LEFT);
clabel.setText("这是自定义的文字带图标的标签CLabel");
clabel.setImage(display.getSystemImage(SWT.ICON_INFORMATION));    

Button按钮

那还有呢,控制按钮上的文字默认时居中的,还可以设置SWT.LEFT和SWT.RIGHT来控制按钮上字符、居左、居右

//创建button按钮
Button button=new Button(shell,SWT.PUSH|SWT.BORDER)

Button按钮常用的 API

addSelectionListener(SelectionListener listener )将监听器添加到监听器集合中,当窗口部件被选中时通知监听器集合,发送在 SelectionListener 接口中定义的一个信息来通知监听器。
 getText(String string)获取按钮的标签文字setText(String string)设置按钮的标签文字。getImage()返回按钮上的图像,如果按钮上没有设置图像,则返回 null。setImage(Image imaget)在按钮上设置图像。getAlignment()获取文本或图像的在按钮中如何显示,必须是 SWT.LEFT、SWT.CENTER、SWT.RIGHT 中的一个值。setAlignment(int alignment)设置文本或图像如何在按钮上定位。对齐方式为:SWT.LEFT、SWT.CENTER、SWT.RIGHT。getSelecton()当按钮样式风格为 SWT.CHECK、SWT.RADIO、SWT.TOGGLE 时,按钮被选中,返回 true;否则,返回 false。setSelecton(Boolean selected)如果按钮样式为 SWT.CHECK、SWT.RADIO、SWT.TOGGLE 样式风格,则可以设置它的选择状态。

Text文本框

Text组件提供一个区域让用户输入相应的文本信息。

默认Text只包含一行??

SWT.WRAP自动换行,在拖动窗口改变文本编辑器的大小是,可以看到其中的文字内容会自动换行。

//创建text文本框
Text text=new Text(shell,SWT.NONE); 

文本框常用的 API

setText(String string)设置文本框内的字符串
setEditable(boolean editable)设置状态不可用(此处为文本不可编辑)
setTextLimit(int limit)设置文本框最多能输入的字符数
setEchoChar(char c) 将输入的字符显示成参数c表示的字符,如密码的输入,c可为“*”
 getText()获得文本内容getText(int start, int end)获取指定文本范围内的文本内容,文本起始位置为 0。getSelectionText()获取选中的文本。addSelectionListener(SelectonListener listener) 添加监听器到监听器集合中,当某个
窗口部件被选中时通知监听集合。通过监听器发送在 SelectonListener 接口中定义的一个消息来通知监听器。addModifyListener(ModifyListener listener) 添加监听器到监听器集合中,当接收的文
本被修改时通知监听集合,通过监听器发送在 ModifyListener 接口中定义的一个消息来通知监听器。addVerifyListener(VerifyListener listener) 添加监听器到监听器集合中,当接收的文
本检验无误时通知监听集合,通过监听器发送在 VerifyListener 接口中定义的一个消息来通知监听器。append(String string)添加字符串。insert(String string)插入字符串。copy()复制选中的文本。cut()剪切选中的文本。paste()从剪贴板上粘贴文本。getLineCount()返回文本中的行数。getLineHeight()返回文本中一行的高度(以像素为单位)。getOrientation()返回文本行的定位,从左到右或从右到左(SWT.LEFT_TO_RIGHT、
SWT.RIGHT_TO_LEFT)。getTextLimit()获取限制文本字符串的位数。setOrientation(int orientation) 设置文本行的 定位,从左到右或从右到左
(SWT.LEFT_TO_RIGHT、SWT.RIGHT_TO_LEFT)。selectAll()选中接收者(这里为文本框)中的文本。showSelection()显示所选的文本。clearSelection()清除所选文本。

Text文本框事件

verify事件:在文本中 插入字符之前或者删除字符之前触发。此时如果不合法,时不会把用户的键盘输入更新到文本框内的。

modify事件:在文本框的 文本内容发生改变后触发,比如关闭程序前会判断文本内容是否改变,有的话需要提醒用户保存。。

Combo下拉框

下拉框(Combo)作用是用户从下拉项中选择选项。下拉框允许编辑功能,可以在Combo中输入文字内容

数组法

setItems(String[] items)用数组为下拉框设置下拉项。

 // 用数组为 Combo 设置下拉框中的下拉项final Combo combo1 = new Combo(shell, SWT.SIMPLE);combo1.setItems(new String[] { "Eclipse", "SWT", "JFace", "AWT", "Swing", "MyEclipse", "Lomboz" }); 

循环设值法对下拉选项进行设值

 final Combo combo2 = new Combo(shell, SWT.DROP_DOWN); combo2.setBounds(150, 25, 90, 20); // 用循环语句设置下拉框中的下拉项for (int i = 0; i < 8; i++) { combo2.add("Page " + i); }

下拉框常用的 API

 add(String string)在下拉框的下拉选项最后添加一项。add(String string, int index)在下拉框的下拉选项的指定位置添加一项。select(int index)将下拉框的第 index+1 项设置为当前项。setText(String str)设置当前选项,str是下拉框中的某一项deselectAll()清除在下拉项中所选的选项,即下拉框中没有选择任何一项
 addModifyListener(ModifyListener listener) 添加监听器到监听器集合中,当接收的文
本被修改时通知监听集合,通过监听器发送到 ModifyListener 接口中定义的一个消息来通知监听器。addSelectionListener(SelectonListener listener) 添加监听器到监听器集合中,当接收
者的选择改变时通知监听集合。通过监听器发送到 SelectonListener 接口中定义的一个消息来通知监听器。clearSelection()将下拉框文本域中的选择设置为空。copy()复制选中的文本。cut()剪切选中的文本。paste()从剪贴板上粘贴文本。deselect(int index)将下拉框中所指定的选项清除,index 为下拉框的下拉项索引。getItem(int index)获取接收者(这里是 Combo)下拉项中相对于零给定的索引选项。getItemCount()获取下拉框的下拉选项的数量。getItems()获取下拉框的下拉选项的字符串数组。setItem(int index, String string)在下拉框的下拉项的指定位置设置选项。remove(int index)将下拉框中清除相对于零的给定索引对应的选项。removeAll()将下拉框中的所有下拉选项清除。

List列表

SWT.NONE 为默认样式,只能选中一个

构造器
public List (Composite parent, int style)

列表框常用的 API

 getSelection()获取List当前所选中的所有列表项。
 add(String string)在接收者(这里为 List)列表选项最后添加一项。add(String string, int index)在接收者(这里指 Combo)列表选项的指定位置添加一项。addSelectionListener(SelectonListener listener) 添加监听器到监听器集合中,当接收
者的选择改变时通知监听集合。通过监听器发送在 SelectonListener 接口中定义的一
个消息来通知监听器。deselect(int index)将接收者(这里是 List)中所指定的选项清除,index 为列表框的
列表项索引。deselectAll()清除接收者(这里是 List)列表项中所选的选项(当前选项)。deselect(int start, int end)将接收者(这里是 List)中所指定的选项范围清除,start 为
指定的起始列表项索引;end 为指定的终止列表项。deselectAll()清除接收者。getItem(int index)获取接收者(这里是 List)列表项中相对于零给定的索引选项。getItemCount()获取接收者(这里是 List)列表选项的数量。getItems()获取接收者(这里是 List)列表选项的字符串数组。getSelectionCount()获取接收者(这里是 List)当前所选中的列表项数量。remove(int index)将接收者(这里是 List)中清除相对于零的给定索引对应的选项。removeAll()将接收者(这里是 List)中的所有列表选项清除。remove(int start, int end)将指定范围内的列表项清除。setSelection(int index)设置接收者(这里是 List)相对于零的给定索引对应的选项。setSelection(String[] items)用数组设置列表框中的列表项。setSelection(int start, int end)在指定的列表项范围内设置列表项。

Group分组框

分组框是个容器,在分组框上能够容纳其他组件(复合控件),如按钮、标签、文本等。

分组框 Group 类是 Composite 的子类,它常用于具有同一类界面的组件。使用 Group 类

        Group group = new Group(shell, SWT.NONE);group.setText("风云合璧");group.setBounds(10, 50, 213, 122);text = new Text(group, SWT.BORDER | SWT.CENTER);text.setBackground(SWTResourceManager.getColor(SWT.COLOR_INFO_BACKGROUND));text.setBounds(10, 89, 193, 23);Button btnNieF = new Button(group, SWT.NONE);btnNieF.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(SelectionEvent e) {text.setText("风神腿");}});btnNieF.setBounds(10, 54, 80, 27);btnNieF.setText("聂风");Button button = new Button(group, SWT.NONE);button.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(SelectionEvent e) {text.setText("排云掌");}});button.setBounds(123, 54, 80, 27);button.setText("步惊云");Label label = new Label(group, SWT.NONE);label.setAlignment(SWT.CENTER);label.setBounds(44, 21, 115, 17);label.setText("雄霸天下");

使同一类的窗口组件布局更加合理、清晰。

构造器
public Group(Composite parent,int style)

注意:分组框不接受任何事件

分组框常用的 API

 getClientArea() 返回 Group 的边界区域。getText() 获得分组框的标题。setText(String string) 设置分组框的标题。

Composite面板

Composite 支持常用样式。SWT.NONE 默认样式,即组件在窗口不可见。

  1. SWT.H_SCROLL 带有水平滚动条。

  1. SWT.V_SCROLL 带有垂直滚动条。

  1. SWT.BORDER 带有可见边框。

Shell类属于Composite类的子类

Composite 类:在面板上同样可以容纳窗口组件。

//shell代表的是父复合控件
Composite composite = new Composite(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
composite.setBackground(SWTResourceManager.getColor(SWT.COLOR_TRANSPARENT));

面板常用的 API

Control getChildren() 获取面板中所有控件
getParent() 获得容纳面板的容器。
getLayout() 得到面板的布局方式。
setLayout(Layout layout) 设置面板的布局方式。
layout() 将面板上的组件重新布局。

composite.layout() 将容器composite上的组件重新布局。相当于刷新?


Composite 刷新

//创建Composite
Composite com = new Composite(shell, SWT.NONE);//执行刷新操作
//获取Composite中所有控件
Control[] con = com.getChildren();
for(Control c: con){c.dispose();
}//填充新内容
//******************//执行刷新操作
com.requestLayout();

ScrolledComposite滚动面板

ScrolledComposite也是Composite的一个子类,但不要将组件直接建立在ScrolledComposite中,

  1. 将组件都建立在一个Composite中

  1. 然后再将Composite建立在ScrolledComposite类中

构造器
ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.BORDER | SWT.V_SCROLL);//设置垂直滚动条显示scrolledComposite.setExpandHorizontal(true);scrolledComposite.setExpandVertical(true);//设置总是显示滚动条scrolledComposite.setAlwaysShowScrollBars(true);scrolledComposite.setBounds(10, 33, 391, 68);Composite composite = new Composite(scrolledComposite, SWT.NONE);composite.setLayout(new GridLayout(1, false));Button btnRadioButton = new Button(composite, SWT.RADIO);btnRadioButton.setText("Radio Button");Button btnCheckButton = new Button(composite, SWT.CHECK);btnCheckButton.setText("Check Button");Button btnCheckButton_1 = new Button(composite, SWT.CHECK);btnCheckButton_1.setText("Check Button");Button btnRadioButton_1 = new Button(composite, SWT.RADIO);btnRadioButton_1.setText("Radio Button");//设置将要被滚动的内容scrolledComposite.setContent(composite);//设置最小显示滚动条的高度和宽度scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));

1、在创建Composite面板时,不仅要将scrolledComposite作为参数传递,之后还要通过setContent() 方法设置Composite被scrolledComposite控制(指滚动条拖动),这样才会生效。

-===---===========-

2、ScrolledComposite 的 setMinSize一般设为子控件的大小,这样可以保证滚动条的范围就是子控件的范围

setMinHeight(int height) ;默认为0。
设置最小显示滚动条的高度:该方法只有当 setExpandVertical(true);时才起作用

setMinWidth(int width);默认为0
设置最小显示滚动条的宽度:该方法只有当 setExpandHorizontal(true);时才起作用

setMinSize(Point size) 或 setMinSize(int width,int height)
设置最小显示滚动条的高度和宽度,也是在setExpandVertical(true)和setExpandHorizontal(true);后才起作用

滚动面板常用的 API

getContent() 获得 ScrolledComposite 上的内容。如果在 ScrolledComposite 上添加了
Button,则返回 Button。getOrigin() 返回 ScrolledComposite 左上角当前显现内容的坐标点。
setContent(Control content) 设置将要被滚动的内容。
setLayout(Layout layout) 设置布局管理方式。setExpandHorizontal(boolean expand) 当 expand 为 true 时,使 ScrolledComposite 上的内容
在水平方向改变大小,如果 ScrolledComposite 上的内容水平宽度大于 ScrolledComposite
宽度,则使之与 ScrolledComposite 宽度相等,如果小于则不改变 ScrolledComposite 上的内容水平方向宽度。setExpandVertical(boolean expand) 当 expand 为 true 时,使 ScrolledComposite 上的内容在垂直方向改 变 大 小 , 如 果 ScrolledComposite 上 的 内 容 垂 直 高 度 大 于ScrolledComposite 高度,则使之与 ScrolledComposite 高度相等。如果小于则不改变ScrolledComposite 上的内容垂直方向高度

SWT复杂组件

菜单栏 Menu

Menu 定义了以下样式

  • SWT.BAR 用于主菜单栏。

  • SWT.DROP_DOWN 用于菜单下拉。

  • SWT.POP_UP 用于右键菜单。

MenuItem 定义了以下样式

SWT.CHECK 复选类型,选中后前面会带有一个小勾。
SWT.PUSH 普通类型,选中后直接产生动作的发生。
SWT.RADIO 单选类型,选中后前面会带有一个
SWT.SEPARATOR 分割类型,在下拉菜单上产生分割符。
SWT.CASCADE 级联菜单,具有 级联 子菜单的特殊菜单项

Menu中还可以有子Menu。菜单可以包含 menuItem(菜单项),而 menuItem 也可以包含菜单(即子菜单)

        //SWT.BAR 用于主菜单栏Menu menu = new Menu(shell, SWT.BAR);shell.setMenuBar(menu);MenuItem mntmFile = new MenuItem(menu, SWT.CASCADE);mntmFile.setSelection(true);mntmFile.setText("文件");Menu menu_1 = new Menu(mntmFile);mntmFile.setMenu(menu_1);MenuItem mntmNewFile = new MenuItem(menu_1, SWT.CASCADE);mntmNewFile.setText("新建");Menu menu_2 = new Menu(mntmNewFile);mntmNewFile.setMenu(menu_2);MenuItem menuItem_2 = new MenuItem(menu_2, SWT.NONE);menuItem_2.setText("项目");MenuItem menuItem_3 = new MenuItem(menu_2, SWT.NONE);menuItem_3.setText("仓库");MenuItem menuItem_4 = new MenuItem(menu_2, SWT.NONE);menuItem_4.setText("文件");MenuItem mntmNewItem = new MenuItem(menu_1, SWT.CHECK);mntmNewItem.setText("打开");//在下拉菜单上产生分割符MenuItem menuItem_1 = new MenuItem(menu_1, SWT.SEPARATOR);MenuItem mntmNewItem_1 = new MenuItem(menu_1, SWT.RADIO);mntmNewItem_1.setText("启动窗口");MenuItem mntmNewItem_2 = new MenuItem(menu_1, SWT.NONE);mntmNewItem_2.setText("全部保存");MenuItem mntmEdit = new MenuItem(menu, SWT.NONE);mntmEdit.setText("编辑");MenuItem mntmSource = new MenuItem(menu, SWT.NONE);mntmSource.setText("视图");MenuItem mntmRefactor = new MenuItem(menu, SWT.NONE);mntmRefactor.setText("项目");MenuItem mntmNavigate = new MenuItem(menu, SWT.NONE);mntmNavigate.setText("生成");MenuItem mntmSearch = new MenuItem(menu, SWT.NONE);mntmSearch.setText("调试");MenuItem mntmProject = new MenuItem(menu, SWT.NONE);mntmProject.setText("测试");MenuItem mntmNewItem_3 = new MenuItem(menu, SWT.NONE);mntmNewItem_3.setSelection(true);mntmNewItem_3.setText("分析");

工具栏ToolBar

ToolBar 用 ToolItem 来设定工具栏上的控件,ToolItem 可以用文本或图片作按钮。

一般,ToolItem 都用 setToolTipText(String string)方法设置提示性的文字

ToolBar 定义了以下样式

SWT.HORIZONTAL 工具栏上按钮为水平方向。
SWT.VERTICAL 工具栏上按钮为垂直方向。
SWT.FLAT 工具栏上按钮为平铺方向。
SWT.RIGHT 工具栏上按钮右对齐方式。
SWT.WRAP 工具栏上按钮上的文字换行。
SWT.SHADOW_OUT 工具栏上按钮显示阴影。

ToolItem 定义了以下样式

SWT.PUSH 工具栏上按钮为普通按钮,可直接引发动作发生。
SWT.CHECK 工具栏上按钮为复选按钮,单击后下陷,再次单击后才弹起。
SWT.DROP_DOWN 工具栏上按钮旁边带下拉菜单。
SWT.RADIO 工具栏上按钮为单选按钮,单击后会立刻弹起来。
SWT.SEPARATOR 工具栏上按钮间的分隔符,没有实质的功能。

选项卡TabFolder

一个选项卡文件夹(TabFolder)由一个或多个TabItem组成

    protected void createContents() {shell = new Shell();shell.setSize(612, 550);shell.setText("SWT Application");Composite composite = new Composite(shell, SWT.BORDER);composite.setBackground(SWTResourceManager.getColor(255, 250, 240));composite.setBounds(10, 10, 581, 347);TabFolder tabFolder = new TabFolder(composite, SWT.NONE);tabFolder.setBounds(10, 20, 383, 236);TabItem tabItem_1 = new TabItem(tabFolder, SWT.NONE);tabItem_1.setText("首页");//TabItem通过setControl方法设置所控制显示的控件Composite composite_1 = new Composite(tabFolder, SWT.NONE);tabItem_1.setControl(composite_1);Composite composite_2 = new Composite(composite_1, SWT.NONE);composite_2.setBounds(10, 10, 251, 115);Label label = new Label(composite_2, SWT.NONE);label.setBounds(10, 10, 61, 17);label.setText("动态");Label label_1 = new Label(composite_2, SWT.NONE);label_1.setBounds(96, 10, 61, 17);label_1.setText("推荐");TabItem tabItem_2 = new TabItem(tabFolder, SWT.NONE);tabItem_2.setText("书影音");TabItem tabItem_3 = new TabItem(tabFolder, SWT.NONE);tabItem_3.setText("小组");TabItem tabItem_4 = new TabItem(tabFolder, SWT.NONE);tabItem_4.setText("市集");TabItem tabItem_5 = new TabItem(tabFolder, SWT.NONE);tabItem_5.setText("我");}

TabFolder 常用 API

addSelectionListener (SelectionListener listener) 将监听器添加到监听集合,当选项卡
选项被选中时,通过给监听器发送在 SelectionListener 接口中定义的一个消息来通知监听器。getItemCount()获得选项卡中包含的选项数。getItems()返回选项卡中项的 TableItem 数组。getSelection()获得接收者中当前选中的 TabItem 数组。getSelectionIndex()获得接收者中当前选中选项相对于 0 的索引,若没有选中项则返回?1。indexOf(TabItem item) 按参数查询选项卡选项,从头到尾直到查到为止,并返回选项卡选项所在的位置索引(索引从 0 开始)。setSelection(int index)将给定索引对应的项设置为当前选项。

TabItem 常用 API

getControl()当用户选择选项卡选项时,返回填充在选项卡上客户区域的控件。
getText()获得选项卡选项的标签文字。
setToolTipText(String string)设置提示性的信息。
setImage(Image image)在选项卡上设置图像。
setText(String text)设置选项卡选项的标签文字。
setControl(Control control)当用户选择选项卡选项时,设置用于填充在选项卡客户区域的控件。

树Tree

树的样式主要表现为折叠的层次结构

Tree 用于表示一棵树,TreeItem 类用于表示一棵树的节点

  • 创建出Tree的对象并将它加入到Shell或者Composite上

Tree tree = new Tree(composite, SWT.BORDER);

Tree 支持的样式

  • SINGLE 表示用户只能选择一个树的结点。

  • MULTI 表示用户只能选择多个树的结点。

  • CHECK 表示树的每个结点都会带有一个复选框。

    protected void createContents() {shell = new Shell();shell.setSize(612, 550);shell.setText("SWT Application");Composite composite = new Composite(shell, SWT.BORDER);composite.setBackground(SWTResourceManager.getColor(255, 192, 203));composite.setBounds(10, 10, 581, 347);Tree tree = new Tree(composite, SWT.BORDER);tree.setBounds(21, 52, 378, 225);TreeItem treeItem_food = new TreeItem(tree, SWT.NONE);treeItem_food.setText("食物");TreeItem treeItem_fruit = new TreeItem(treeItem_food, SWT.NONE);treeItem_fruit.setBackground(SWTResourceManager.getColor(0, 255, 0));treeItem_fruit.setText("水果");TreeItem treeItem_apple = new TreeItem(treeItem_fruit, SWT.NONE);treeItem_apple.setText("苹果");treeItem_apple.setExpanded(true);TreeItem treeItem_banana = new TreeItem(treeItem_fruit, SWT.NONE);treeItem_banana.setText("香蕉");treeItem_fruit.setExpanded(true);TreeItem treeItem_vegetable = new TreeItem(treeItem_food, SWT.NONE);treeItem_vegetable.setBackground(SWTResourceManager.getColor(0, 255, 0));treeItem_vegetable.setText("蔬菜");TreeItem ttreeItem_tomato = new TreeItem(treeItem_vegetable, SWT.NONE);ttreeItem_tomato.setText("西红柿");TreeItem treeItem_cucumber = new TreeItem(treeItem_vegetable, SWT.NONE);treeItem_cucumber.setText("黄瓜");TreeItem treeItem_potato = new TreeItem(treeItem_vegetable, SWT.NONE);treeItem_potato.setText("土豆");treeItem_vegetable.setExpanded(true);treeItem_food.setExpanded(true);}

怎么让树初始时,是展开状态呢?

添加子节点之后,加一句:

TreeItem.setExpanded(true);

1.Tree 常用 API

addSelectionListener (SelectionListener listener)将监听器添加到监听器集合中,当接
收者选择改变时通知监听器集合,通过监听器发送在 SelectionListener 接口中定义的一个消息通知监听器。addTreeListener (TreeListener listener) 将监听器添加到监听器集合中,当接收者一项被展开或者收缩时通知监听器集合,通过监听器发送在 TreeListener 接口中定义的
一个消息通知监听器。clearAll(boolean all)清除接收者的所有项。clear(int index, boolean all)从接收者中清除相对于 0 的给定索引对应的项。deselectAll()取消接收者中的所有选中项。showItem(TreeItem item)在 tree 中显示 TreeItem 项。showSelection()在 tree 中显示选中的 TreeItem 项。getItemCount()获得 tree 的所有项的数量。selectAll()选中接收者的所有项。setTopItem(TreeItem item)设置接收者当前位于顶层的项。

TreeItem 常用 API

 clearAll(boolean all)清除接收者的所有项。clear(int index, boolean all)从接收者中清除相对于 0 给定索引对应的项。getBackground()获得接收者的背景颜色。getForeground()获得接收者的前景颜色。getExpanded()如果接收者处于展开状态,则返回 true;否则,返回 false。getItemCount()获得接收者包含的直接子项的数量。getGrayed()如果接收者处于灰度状态,则返回 true;否则,返回 false。getItem(int index)从接收者中获得相对于 0 给定索引对应的项。getParentItem()获得接收者的父项,这里一定是 Tree。setText(String text)设置接收者的标签文字。setGrayed (boolean grayed)设置接收者的灰度状态。setForeground (Color color)设置接收者的背景颜色。setExpanded (boolean expanded)设置接收者的展开状态。setImage(Image image)设置接收者的图像。

拖放功能DragSource和DropTarget

DragSource、DropTarget

SWT的拖放功能的实现主要使用了DragSource、DropTarget这两个类,开发人员只需要实现其事件的接口,既可以对控件上的文本、HTML、RTF及附件进行拖放操作,即把一个控件上的文本、HTML、RTF及附件拖放到另一个控件


SWT图形绘画GC

Draw2D和GC

用SWT绘图通常由两种方法,

  1. 一种是借助Graphics Context

  1. 另一种是利用Draw2D

然而Draw2D是一个基于SWT Composite的轻量级组件,于是在效率上,它无法体现出SWT的Native Code的速度优势。故其虽然强大,但仅适用于绘图工作不是系统瓶颈的应用程序。

GC:Graphics Context

我们可以在任何实现了org.eclipse.swt.graphics.Drawable接口的类上绘制图形,这包括一个控件,一幅图像,一个显示设备或一个打印设备。类org.eclipse.swt.graphics.GC是一个封装了所有可执行的绘图操作的图形上下文(Graphics Context)。


Canvas

Canvas主要用于显示图像,既可以在Canvas上画图,也可以将图片显示于其中。

双缓冲技术

一种减少屏幕闪烁的方法,就是使用双缓冲技术。可以先根据Canvas客户区域大小创建Image对象,然后使用GC(Image)将其绘画到Canvas上;

绘制线条和形状

绘制线条

GC.drawLine(int x1, int y1, int x2, int y2);
画一条从坐标点(x1,y1)到坐标点(x2,y2)的直线,如果两点的坐标值相同就相当于画一个圆点。
----------------------
GC.drawPolyline(int[] pointArray);
画一条连接多个坐标点的直线,int[] 存放着要连接的x、y坐标值。

绘制形状

绘制标准矩形

GC.drawRectangle(int x, int y, int width, int height);
画一个矩形区域,int x,int y是矩形左上角的坐标点,int width,int heighy分别是矩形的宽和高。
提示:可以将Rectangle作为一个单独的参数传送给绘画方法。GC.drawRectangle(Rectangle);

绘制圆形(或椭圆)

GC.drawOval(int x, int y, int width, int height);
一个椭圆形是画在矩形里的,所以由矩形的左顶点坐标以及宽和高来定义。当width== height时,绘制出来的就是圆

线条设置

GC.setLineStyle(int style);

线条(Lines)拥有多种风格,org.eclipse.swt.SWT中提供了定义线条风格的常量,这些线条风格常量以LINE_开头。

SWT.LINE_SOLID

SWT.LINE_DOT

SWT.LINE_DASH

SWT.LINE_DASHDOT

SWT.LINE_DASHDOTDOT

GC.setLineWidth(int width);

线条的默认宽度是1像素(pixel), 当然也可以使用GC的lineWidth字段设置线条宽。

gc.setLineWidth(2);

gc.setLineWidth(4);


绘制图像

GC.drawImage(Image image, int x, int y);
每一个图像(image)都有一个由它自身范围所决定的大小,可以使用image.getBounds()获取。当绘画了一个图像,此图像就会以它自身范围的宽度和高度显示出来。


SWT布局管理器

布局是将 UI(User Interface)组件合理地摆放在窗体中的过程,使用布局管理器可对窗体上的组件进行有效的管理。一方面使窗口界面更加友好美观;另一方面使用布局管理器提供的程序跨平台性,在不同系统平台下都能保持界面的稳定性

充满布局FillLayout

将所有窗口组件以相同尺寸放置到一行或者一列中,不能换行

Composite composite = new Composite(shell, SWT.NONE);
composite.setLayout(new FillLayout(SWT.HORIZONTAL));

默认情况下设置布局为 FillLayout 是横向排列的(水平充满),在创建布局时构造函数传入布局样式即可显式声明布局排列方式

public FillLayout() 
public FillLayout(int type)//SWT.HORIZONTAL、SWT.VERTICAL

那么就改一下布局为垂直充满

 composite.setLayout(new FillLayout(SWT.VERTICAL));


行布局RowLayout

public RowLayout(); 
public RowLayout(int Style);//SWT.HORIZONTAL为默认  SWT.VERTICAL

RowLayout 布局支持自动换行

组件一次排放在窗体上,当 窗体宽度不足时,窗体上的组件自动折行
composite.setLayout(new RowLayout(SWT.HORIZONTAL));

默认创建了一个水平的row layout,并折行显示

当我把composite宽度拉伸时,组件也就跟着变化了。。

RowLayout把所有的控件放在一行或一列中。但是,它不会把所有的控件都设为相同的大小(相比于FillLayout)。如果空间不够,它会把控件放到另一行或另一列中

RowLayout使用RowData的实例来决定控件的初始宽度和高度

把一个RowData对象关联到一个控件;layout从控件中获取RowData以决定控件的大小和排布

        Button button = new Button(composite, SWT.NONE);//把一个RowData对象关联到一个控件button.setLayoutData(new RowData(64, SWT.DEFAULT));button.setText("新房");Button button_1 = new Button(composite, SWT.NONE);button_1.setLayoutData(new RowData(84, SWT.DEFAULT));button_1.setText("二手房");Button button_2 = new Button(composite, SWT.NONE);button_2.setLayoutData(new RowData(78, SWT.DEFAULT));button_2.setText("租房");

网格布局GridLayout

  • 网格布局是通过其构造方法构建窗口的基本布局

  • 通过其属性来对组件进行简单的定位设置

构造器
public GridLayout() //将容器设置成为一列,所有组件在容器中从上至下均排成一列。public GridLayout(int numColumns, boolean makeColumnsEqualWidth)
//numColumns 设置窗口列数
//makeColumnsEqualWidth 设置为true组件等宽排列,一般为false

GridLayout 的属性

GridLayout有很多重要属性,主要包括numColunms、makeColumnsEqualWidth、marginWidth、marginHeight、verticalSpacing、horizontalSpacing

numColumns 属性用来设置容器的列数目。
make ColumnsEqualWidth=true 使组件各列等距离分开。

horizontalSpacing :控制各行组件之间横向的间距(默认5像素)
verticalSpacing :控制各列组件之间纵向的距离

marginWidth :控制最左边组件和最右边组件与边框的距离
marginHeight :控制顶部组件和底部组件与边框的距离

marginLeft :控制左边的一列组件与左边框的距离
marginRight :控制右边的一列组件与右边框的距离
marginTop :控制顶部组件与上边框的距离
marginBottom :设置底部组件与底边框的距离

GridData 控制布局

注意:GridData的对象只能应用在一个组件上

//底色是黄色的Group框框
GridData gd_group = new GridData(SWT.CENTER, SWT.CENTER, false, false, 6, 1);

可以看到这里构造方法有六个参数分别对应着:

  1. int horizontalAlignment 水平对齐方式 (BEGINNING, CENTER, END, FILL)

  1. int verticalAlignment 垂直对齐方式 (TOP, CENTER, BOTTOM, FILL)

  1. boolean grabExcessHorizontalSpace 是否占用水平方向剩余空间

  1. boolean grabExcessVerticalSpace 是否占用竖直方向剩余空间。

  1. int horizontalSpan 水平空间(代表占据整个网格的多少个列)

  1. int verticalSpan 垂直空间(代表占据整个网格的多少行)

    protected void createContents() {shell = new Shell();shell.setSize(600, 300);shell.setText("SWT Application");shell.setLayout(new FormLayout());Composite composite = new Composite(shell, SWT.BORDER);composite.setLayoutData(new FormData());//设置窗口列数6列composite.setLayout(new GridLayout(6, false));Button button_1 = new Button(composite, SWT.CENTER);//最后俩个参数是占据网格的行数和列数GridData gd_button_1 = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);gd_button_1.widthHint = 75;button_1.setLayoutData(gd_button_1);button_1.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(SelectionEvent e) {}});button_1.setText("视频");Button button_2 = new Button(composite, SWT.CENTER);GridData gd_button_2 = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);gd_button_2.widthHint = 75;button_2.setLayoutData(gd_button_2);button_2.setText("综艺");Button button_3 = new Button(composite, SWT.CENTER);button_3.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(SelectionEvent e) {}});GridData gd_button_3 = new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1);//设置控件的宽度和高度gd_button_3.widthHint = 72;gd_button_3.heightHint = 28;button_3.setLayoutData(gd_button_3);button_3.setText("体育");Button button_4 = new Button(composite, SWT.CENTER);GridData gd_button_4 = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);gd_button_4.widthHint = 81;button_4.setLayoutData(gd_button_4);button_4.setText("游戏");Button button_5 = new Button(composite, SWT.NONE);GridData gd_button_5 = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);gd_button_5.widthHint = 77;button_5.setLayoutData(gd_button_5);button_5.setText("剧集");Button button = new Button(composite, SWT.NONE);GridData gd_button = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);gd_button.widthHint = 78;button.setLayoutData(gd_button);button.setText("更多");Group group = new Group(composite, SWT.NONE);group.setBackground(SWTResourceManager.getColor(SWT.COLOR_INFO_BACKGROUND));GridData gd_group = new GridData(SWT.CENTER, SWT.CENTER, false, false, 6, 1);gd_group.heightHint = 145;gd_group.widthHint = 482;group.setLayoutData(gd_group);group.setText("视频热榜");List list = new List(group, SWT.BORDER | SWT.V_SCROLL);list.setItems(new String[] {"1 张国荣  1299万热度 93.8万次观看", "2 张继科  1073万热度 179万次观看", "3 不是所有人都适合午睡  927万热度  44.5万次观看"});list.setBounds(10, 25, 468, 61);}

GridData 的构造方法

public GridData() //为默认样式public GridData(int style) //style 为 GridData 支持的样式public GridData(int width,int height) //指定组件的宽度和高度,以像素为单位public GridData(int horizontalAlignment, int verticalAlignment, boolean grabExcessHorizontalSpace, boolean grabExcessVerticalSpace) public GridData(int horizontalAlignment, int verticalAlignment, boolean grabExcessHorizontalSpace, boolean grabExcessVerticalSpace, int horizontalSpan, int verticalSpan)

GridData的样式

使用举例:

    public static void main(String[] args) {final Display display = Display.getDefault();final Shell shell = new Shell();
//--------------------------------shell.setText("GridData 实例");//将容器分为 2 列shell.setLayout(new GridLayout(2, false));final Button button1 = new Button(shell, SWT.NONE);button1.setText("Button1");final Button button2 = new Button(shell, SWT.NONE);button2.setText("Button2");final Button button3 = new Button(shell, SWT.NONE);button3.setText("Button3");final Button button4 = new Button(shell, SWT.NONE);button4.setText("B4");//sytle为 GridData.Fill_BOTH,双向充满GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);//一个GridData只能设置一个button4button4.setLayoutData(gridData);shell.open();shell.layout();while (!shell.isDisposed()) {if (!display.readAndDispatch())display.sleep();}}

如下图:是双向对齐的样式。看的出来没有水平或者垂直充满窗体。也没有说因为B4字少,就把B4按钮缩小成原样。

GridData 的属性

horizontalSpan 用来设置组件占用网格的列数,但组件本身大小不变

    public static void main(String[] args) {shell.setLayout(new GridLayout(3, false));new Button(shell, SWT.NONE).setText("Button1");new Button(shell, SWT.NONE).setText("Button2");new Button(shell, SWT.NONE).setText("Button3");final Button button = new Button(shell, SWT.NONE);button.setText("Button4");GridData griddata = new GridData();// 水平抢占 3 列griddata.horizontalSpan = 3;button.setLayoutData(griddata);new Button(shell, SWT.NONE).setText("Button5");}

verticalSpan 属性用来设置组件占有的行数目


widthHint和heightHint 设置控件的长和宽

widthHint 属性用来设置组件的宽度,以像素为单位

heightHint 属性用来设置组件的高度,以像素为单位


grabExcessHorizontalSpace和grabExcessVerticalSpace设置水平和垂直抢占空间的方式

属性面板发生变化时,单元格抢占空间的方式,默认为false

对与设定随着窗口大小改变而改变的控件设置为true


horizontalAlignment 和 verticalAlignment 设置组件的水平和垂直方向对齐方式

griddata.horizontalAlignment=GridData.BEGINNING; 
griddata.horizontalAlignment=GridData.CENTER; 
griddata.horizontalAlignment=GridData.END;
griddata.horizontalAlignment=GridData.FILL//设置水平填充方式为充满单元格 

horizontalIndent 和verticalIndent 设置缩进大小

horizontalIndent 属性设置组件向右移动的距离,以像素为单位,默认0

verticalIndent 属性设置组件向下移动的距离,以像素为单位,默认0


表格布局FormLayout

构造器
public FormLayout()

marginWidth、marginHeight 为 FomLayout 的两个属性。

marginWidth 属性用来设置组件距离容器 左边框的距离(以像素为单位)。
marginHeight 属性用来设置组件距离容器 上边框的距离(以像素为单位)。

FormData控制布局

FormData用FomAttachment类来控制窗口小部件的大小和位置:一个FormData最多用4个FormAttachment,它们分别对应这个小部件的4个面:顶部,底部,左边和右边

FormAttachment计算位置和大小的方法:
y=ax+b
 
在这个等式中,在数学上y代表的是纵坐标,x是横坐标值.a是斜率,b是偏移量.

按照FormAttachment的规则,y是 高,x是宽度,a是一个相对其它部件的百分率,b是偏移量FormAttachment实例中的每个数据成员分别代表这些值.

Constructor

Description

FormAttachment(Control control)

以另外的某个部件为参照物.

FormAttachment(Control control, int offset)

以另外的某个部件为参照物,加上偏移量.

FormAttachment(Control control, int offset, int alignment)

以另外的某个部件为参照物,加上偏移量和alignment

FormAttachment(int numerator)

设定分子.分母为100,没有偏移量

FormAttachment(int numerator, int offset)

指定分子和偏移量,分母默认100

FormAttachment(int numerator, int denominator, int offset)

特定的分子,分母,偏移量

        shell.setLayout(new FormLayout());        Composite composite = new Composite(shell, SWT.NONE);FormData fd_composite = new FormData();//一个FormData最多用4个FormAttachmentfd_composite.bottom = new FormAttachment(0, 204);fd_composite.right = new FormAttachment(0, 384);fd_composite.top = new FormAttachment(0, 27);fd_composite.left = new FormAttachment(0, 38);composite.setLayoutData(fd_composite);composite.setLayout(new FormLayout());text_1 = new Text(composite, SWT.BORDER);text_1.setText("文本输入框");FormData fd_text_1 = new FormData();//一个FormData最多用4个FormAttachmentfd_text_1.top = new FormAttachment(100, -168);fd_text_1.bottom = new FormAttachment(100, -145);fd_text_1.right = new FormAttachment(100, -252);fd_text_1.left = new FormAttachment(0);text_1.setLayoutData(fd_text_1);Button button_1 = new Button(composite, SWT.BORDER | SWT.CHECK);button_1.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(SelectionEvent e) {}});FormData fd_button_1 = new FormData();//一个FormData最多用4个FormAttachmentfd_button_1.top = new FormAttachment(text_1, 31);fd_button_1.left = new FormAttachment(0);fd_button_1.right = new FormAttachment(0, 94);button_1.setLayoutData(fd_button_1);button_1.setText("复选按钮");List list = new List(composite, SWT.BORDER | SWT.V_SCROLL);list.setItems(new String[] {"我的", "热搜", "文娱", "要闻", "同城", "更多"});FormData fd_list = new FormData();//一个FormData最多用4个FormAttachmentfd_list.top = new FormAttachment(text_1, -1, SWT.TOP);fd_list.right = new FormAttachment(100, -21);fd_list.bottom = new FormAttachment(0, 84);fd_list.left = new FormAttachment(100, -226);list.setLayoutData(fd_list);

FormData最多包含4个FormAttachment 实例,每个对应了与它联系的部件的一边.另外,FormData也可以指定宽和高.表四列出了FormData的数据成员:

Attribute

Description

FormAttachment bottom

The FormAttachment corresponding to the bottom side of the control.

这个FormAttachment 用 来指定部件的底部位置

int height

这个部件的高度.单位为象素.

FormAttachment left

这个FormAttachment 用来指定部件的左部位置

FormAttachment right

这个FormAttachment 用来指定部件的右部位置

FormAttachment top

这个FormAttachment 用来指定部件的顶部位置

int width

这个部件的宽度.单位为象素.


SWT事件与监听器

display 管理事件循环

SWT 是通过 display 管理事件循环的。

一旦启动 SWT 应用程序,SWT 使用 readAndDispatch()方法从系统平台的事件队列中读取事件,并把读取的事件分配给适当的接收者。

SWT中display对象就是一个UI线程,并且负责管理队列中得事件。

//shell窗口资源未释放
while (!shell.isDisposed()) {if (!display.readAndDispatch()) {//事件处理完毕,UI线程恢复睡眠状态display.sleep();}
}

对于每种事件有与之对应的 Listener类。

如果一个事件为 X,那么对应的监听器(Listener)类就是 XListener,它的添加监听方法为 addXListener。
如鼠标监听器MouseListener,键盘监听器KeyListener,选择监听SelectionListener。

按钮选中事件

widgetSelected处理用户用鼠标选择窗口小部件的事件,例如,点击一个按钮。

widgetDefaultSelected处理当文本(Text)时,用户[回车]键所产生的事件。经测试button对回车键并不会响应DefaultSelection事件。

在双击列表框(List)时也会响应DefaultSelection事件

        // 创建button按钮Button button = new Button(shell, SWT.PUSH | SWT.BORDER);button.setText("点我点我");//SelectionEvent 当某个 GUI 元素被选中时发生button.addSelectionListener(new SelectionAdapter() {public void widgetSelected(SelectionEvent e) {MessageDialog.openInformation(shell, null, "单击按钮触发!!");}});

可以通过SelectionEvent对象获得发生该事件的一些信息

event.widget:事件发生的控件对象,通常需要强制类型转换,因为所有的控件都继承自widget类。
event.time:事件发生时的事件。

适配器、监听器、事件

SWT 适配器和与之对应的监听器接口


事件和与之对应的监听器


无类型事件机制

addListener (int eventType, Listener listener)增加一个监听器到一个监听器集合,当触发了指定类型的事件时,监听器通过 handleEvent()来获知事件。

eventType可能如下:

使用举例

如果只是单一的事件而不是选择方式(“case 样式”的多种分支监听模式)代码可以写成如下方式:

//widget 为窗口小部件对象,可以为按钮、下拉框、列表框等。 
widget.addListener(int eventType, new Listener() { public void handleEvent(Event event) { ... } });

无类型事件机制: 允许监听器实现“case 样式”的监听模式,也可以用 if 语句来实现

Listener listener = new Listener() {public void handleEvent(Event e) {switch (e.type) {case SWT.MouseDown:MessageDialog.openInformation(shell, null, "MouseDown!!");break;case SWT.Resize:MessageDialog.openInformation(shell, null, "Shell Resize!!");break;}}
};
shell.addListener(SWT.MouseDown, listener);

控件的位置和大小

getBounds 可以获取发生事件的控件的大小和位置

setBounds 可以设置控件显示的位置和大小


键盘事件

KeyEvent属性

判断键盘是否使用了辅助键的方法


鼠标事件

MouseEvent属性

通过MouseEvent对象获得下x,y坐标是相对于按钮的,要设置按钮的位置,得换算成相对于窗口得坐标位置。Display.getCurrent().map()


Eclipse表单开发

FormToolkit表单工具

FormToolkit简介

通过FormToolkit对象创建控件。。FormToolkit对象携带了系统的资源,在使用完后需要释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17040.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟简单却又晦涩的 Promise 说 Hello

一、前言 我不知大家是如何接触到的 Promise, 我想可能是 Axios? 可能是对异步方法的封装&#xff1f;可能是对 Vue 中方法的封装&#xff1f;对 React 中方法的封装&#xff1f;我记得我当时还是只会一些 ES5 语法小白的时候,为了看懂别人写的代码&#xff0c;大量恶补 ES6 的…

在win10电脑上搭建python环境下的本地AI绘画工具Stable Diffusion

随着Chatgpt的横空出世&#xff0c;人工智能受到了前所没有的热棒&#xff0c;AI绘画也进入大众的视野。 Stable Diffusion是一种可以部署在本地环境上运行的人工智能绘画工具&#xff0c;图形运算主要用到的是显卡的GPU性能&#xff0c;因此最好有至少4G显存的显卡。 Stable…

chatgpt赋能python:Python画图写名字——提升SEO的绝佳选择

Python画图写名字——提升SEO的绝佳选择 随着互联网的发展&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;变得越来越重要&#xff0c;而优秀的内容和图片对SEO排名的提升起着非常重要的作用。Python作为一种高效的编程语言&#xff0c;也是SEO方面的新宠&#xff0c;因…

Qt6教程之三(6) 界面自绘与绘图类

据博主所知&#xff0c;Qt的绘图技术目前分为三大阵营&#xff0c;分别是&#xff1a; 一&#xff0c;基于QWidget的界面自绘制&#xff0c;这种方式纯粹为纯代码绘制&#xff0c;随着绘制图形量的不断增加&#xff0c;会导致其难以管理和性能不佳&#xff1b; 二&#xff0c…

HighCharts实现3D不同高度圆环图、3D饼图

最近做可视化比较多&#xff0c;就常用的图表类型做了一下总结。 因为做可视化的图表代码量非常大&#xff0c;所以会把echarts图表单独抽离出来&#xff0c;封装成一个组件&#xff0c;也可以复用&#xff0c;所以这里我直接把封装的组件直接放在这里&#xff0c;是可以直接拿…

直播合辑 | 微软ATP与您相约100场公益演讲

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; Public100已历经了近一年的春夏秋冬&#xff0c;截止目前我们一共举办33场公益直播&#xff0c;由微软及合作伙伴中从事 AI 相关工作的工程师、产品经理、市场总监、运营经理等各类专家和学者&#xff0c;分享自己在学…

微信春节大数据出炉:《三体》阅读量第一 ;曝iOS 17应用商店将向第三方开放;斯坦福大学推出DetectGPT|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

ChatGPT 串接 Firebase,實現上下文歷史紀錄

ChatGPT 串接 Firebase&#xff0c;實現上下文歷史紀錄 在使用 ChatGPT API 時&#xff0c;因為 API 本身是「一次性」&#xff0c;無法儲存聊天的歷史紀錄&#xff0c;這也衍生了「無法串聯上下文」的問題&#xff0c;不過如果將 ChatGPT 串連 Firebase 的 Realtime database…

ChatGPT:我围观了量子位MEET2023智能未来大会,还当了一回课代表

编辑部 ChatGPT 发自 凹非寺量子位 | 公众号 QbitAI 什么是“MEET2023智能未来大会”&#xff1f; 大会上来了哪些重磅嘉宾&#xff1f; 他们在大会上探讨了什么主题&#xff1f; 没错&#xff01;ChatGPT也参与了今年的大会&#xff0c;作为AI代表与人类嘉宾们一起回顾这一年来…

LM详解 GPT3,GPT2, GPT1 论文译读

LM详解 GPT3&#xff0c;GPT2, GPT1 论文译读 T5&#xff0c;Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer&#xff0c;2019 arxiv https://arxiv.org/abs/1910.10683 中译 https://zhuanlan.zhihu.com/p/89719631 讨论 如何评价 Goo…

chatgpt赋能python:Python提取扫描版PDF:一篇SEO文章

Python提取扫描版PDF&#xff1a;一篇SEO文章 Python在数据科学、自然语言处理、机器学习等领域中广泛应用。今天我们将关注Python的另一个应用&#xff1a;提取扫描版PDF。本文介绍了如何使用Python提取文本以及搜索引擎优化&#xff08;SEO&#xff09;的最佳实践。 提取扫…

Python3,5行代码,Chatxxx能对PDF文件进行旋转、提取、合并等一系列操作,看了这篇,80岁老奶奶走路都不扶墙了。

ChatPDF的妙用 1、引言2、代码实战2.1 原理2.2 安装2.2 示例2.2.1 创建PDF文件2.2.2 旋转PDF文件2.2.3 拆分PDF文件2.2.4 合并PDF文件2.2.5 提取PDF文件内容 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;最近干啥了&#xff1f; 小鱼&#xff1a;最近&#xff1f; 你指…

chatgpt赋能python:Python实现多关键词搜索PDF文件

Python实现多关键词搜索PDF文件 概述 在今天的数字化社会中&#xff0c;很多信息都以数字化的形式存储在PDF文件中。这让我们在搜索特定信息时面临很多挑战&#xff0c;特别是当我们需要同时搜索多个PDF文件并集中检索这些文件时。 在这篇文章中&#xff0c;我们将介绍如何使…

零代码编程:用ChatGPT将PDF文件的表格批量转为Excel表格

电脑中有几百个PDF文件&#xff0c;文件内容格式一致&#xff0c;每个PDF文件第一页是一个表格。想把这几百个PDF文件里面的表格都提取出来&#xff0c;转为excel表&#xff0c;该怎么办&#xff1f; 打开ChatGPT&#xff08;一定要用GPT4&#xff0c;编程能力很强。相比之下&a…

chatgpt赋能python:Python抓取PDF内容:一个全面的指南

Python 抓取 PDF 内容&#xff1a;一个全面的指南 引言 Python 作为一种广泛使用的编程语言&#xff0c;已经拥有了许多应用功能。其中之一是抓取 PDF 文件的内容。 PDF 文件在今天的数字化世界中使用广泛&#xff0c;使得从 PDF 文件中提取内容变得尤其重要&#xff0c;对于…

ChatGPT-4模型读取PDF/网页链接实测结果!

联网和插件功能使用 直接在设置里面&#xff0c;把这两个开关开起来 联网功能&#xff1a; 3.5不会的东西是不会自动联网搜索的&#xff0c;Plus4.0可以进行联网搜索答案 插件功能&#xff1a; 首先在Settings里面把Plugins进行安装&#xff0c;选中要安装的插件&#xff0c;直…

a16z深度分析:AI 将创造哪些新的游戏玩法?

来源/a16z 编译/Nick 早期关于游戏中的生成式 AI 革命的讨论主要集中在 AI 工具如何提高游戏创作者的效率&#xff0c;使得游戏的制作速度比以前更快、规模更大。从长远来看&#xff0c;我们认为&#xff0c;AI 不仅能改变创造游戏的方式&#xff0c;还能改变游戏本身的性质。 …

ChatGPT对金融业将产生哪些影响?

黄浦区金融办 2023-05-22 02:30 发表于上海 近期人机互动模型ChatGPT进入应用领域&#xff0c;意味着人工智能的发展达到了新高地。那么&#xff0c;人工智能在金融领域的应用与未来发展趋势如何&#xff1f;会给金融机构带来哪些挑战&#xff1f;日前&#xff0c;《金融时报》…

OpManager 实时网络监控

网络是全球企业背后的基础。它在为您的员工提供行政服务以及为各大洲的客户提供服务方面发挥着关键作用。网络可帮助您将信息保存在一个集中位置 - 需要和限制所有其他入站请求的人员可以访问。那么&#xff0c;您如何提供持续的一流最终用户体验并维护快速发展的网络呢&#x…

使用 LangChain、Pinecone 和 LLM(如 GPT-4 和 ChatGPT)构建基于文档的问答系统

目录 一、简介 二、为什么语义搜索GPT问答比微调GPT更好&#xff1f; 2.1、更广泛的知识覆盖&#xff1a; 2.2、特定于上下文的答案&#xff1a; 2.3、适应性 2.4、更好地处理模糊查询 三、LangChain 模块 四、设置环境 五、加载文档 六、分割文档 七、使用 OpenAI 嵌入…