当前位置:首页 » 操作系统 » eclipseswt源码

eclipseswt源码

发布时间: 2022-12-31 03:32:52

㈠ SWT和Swing代码的区别

笔者过去学习过Swing(也算是AWT的增强版吧) 现在开始学习一下 SWT 还没有开始深入 JFace 和 RCP 一步步来吧 先学好基础的 又不用着急做项目用 本文讨论的内容仅限于我已知的 SWT和Swing 范围 希望能对有 Swing 经验的人快速了解 SWT 有所帮助

第一个不同点就是 SWT 的类库结构不像 Swing 没有单一的父组件 SWT 中有好几个父类

◆Widget —— 基本的 SWT GUI 组件(类似于 java AWT 中的 Component 和 Swing 中的 JComponent) Widget 是一个抽象类

◆Control —— 拥有操作系统的对等物的窗口小部件(换句话说 在操作系统中具有同一身份) Control 是一个抽象类

◆Composite —— 包含其他控件的控件(类似于 Java AWT 中的 Container 和 Swing 中的 JPanel)

◆Item —— 其他控件包含的窗口小部件(该控件可能不是复合控件) 比如列表和表 注意 包含一些项的控件很少包含其他控件 反之亦然 Item 是一个抽象类

SWT 的组件不能随意继承 其源代码中会标注 IMPORTANT This class is <em>not</em> intended to be subclassed 如果你那样做了 运行的时候 SWT 系统就会报错 也不能任意包含子组件 某些组件 例如 Tree 只能接收 TreeItem 作为其子组件 这样在写一些可重用的图形组件的时候必须注意 Swing 中的写法不能直接套用在 SWT 中

Swing 的所有图形界面类都继承自 java awt Container 这意味着所有的 Swing 组件都可以包含任意的子组件 也可以被继承 这是两个类库的第一个不同点

第二个不同点就是 SWT 没有利用 Java 的自带垃圾收集功能来管理对象的销毁 大部分对象都必须调用 dispose() 方可完成资源的释放

第三个不同点就是在组件的显示上 SWT 抽象了一个 Display 对象来处理 SWT 和操作系统底层组件的通信 资源申请释放 事件循环 任何显示的 SWT 组件必须有且仅有一个 Display 对象

第四个不同点就是 Swing 的组件实现了 MVC 机制 但是 SWT 没有(目前来看)提供 MVC 机制 也就是说绝大多数 SWT 组件都是不可以更换显示的外观的 我的意思是例如像皮肤这样的机制 例如 实现一个 Office 外观的橙色菜单条的显示 SWT 是不能通过简单的编码来实现的(也许有 但是还没找到相关的资料)

SWT 的每个组件对象提供了 setData(Object) 这样的方法来给组件存储一个或者多个数据对象 Swing 中没有类似的概念

第五个不同点就是绝大多数的 SWT 组件创建的时候都必须指定父组件和风格属性 也就是必须有一个 parent 对象 也不能运行的时候动态变更父组件 具体例如 Menu 对象里有 Decorations getParent () 但是并无对应的 setParent() 方法 组件创建之后即自动加入父组件成为其一员 这和 Swing 的必须通过 add() 方法来加入父组件是不一样的 大多数的 SWT 组件不提供无参数的构造器 这就意味这他们不是 JavaBean 这点上 Swing 的绝大多数组件都是 JavaBean

总结以上这些内容我们可以感觉到 SWT 更像是操作系统本地组件的一种封装 而不是基于 Java OO 的概念对其进行映射 其优点就是数据结构简单

好了 接下来还是通过一些SWT和Swing的代码来比较吧 第一个是经典的 Hello World

SWT 版本

import eclipse swt widgets *;

public class SWTHelloWorld {

public static void main(String[] args) {Display display = new Display();Shell shell = new Shell(display);shell setText( Hello World! );shell open();while (!shell isDisposed()) {if (!display readAndDispatch())display sleep();}display dispose();}}

Swing 版本

import javax swing JFrame;

public class SwingHelloWorld {

public static void main(String[] args) {JFrame frame = new JFrame();frame setTitle( Hello World! );frame setDefaultCloseOperation(JFrame DISPOSE_ON_CLOSE);frame setSize( );frame setVisible(true);}}

SWT 的 Text 属性在不同的组件中有不同的意思 对于窗体来说它是标题 对于控件来说它是显示的文本 Swing 中这个是分开的 对于窗口来说是 Title 属性 对于控件来说是 Text 属性 SWT 的事件循环基于显式的 while 模式 而 Swing 已经在底层封装好了事件的循环和处理 所以这两段代码最明显的不同就是 SWT 多了时间循环的部分 即文中粗体的部分

接着我们来看看继承 SWT 的组件会有什么后果 在 Swing 中继承一个组件然后向其中添加子组件 例如建立一个自定义的工具栏 然后向其中加入子栏目 并最后显示出来 这是经常进行的操作 再看看 SWT 中

import eclipse swt widgets Display;import eclipse swt widgets Shell;import eclipse swt widgets ToolItem;import eclipse swt SWT;

public class NewToolBar extends eclipse swt widgets ToolBar {

public static void main(String[] args) {try {Display display = Display getDefault();Shell shell = new Shell(display);new NewToolBar(shell SWT NULL);

shell open();while (!shell isDisposed()) {if (!display readAndDispatch())display sleep();}} catch (Exception e) {e printStackTrace();}}

public NewToolBar(Shell parent int style) {super(parent style);new ToolItem(this SWT NULL);}

}

lishixin/Article/program/Java/hx/201311/26347

㈡ 用eclipse怎么作swt的窗体的开发亚

首先要在Eclipse安装文件中找到SWT包,Eclipse组织并不提供单独的SWT包下载,必须下载完整的Eclipse开发环境才能得到SWT包。SWT是作为Eclipse开发环境的一个插件形式存在,可以在${你的eclipse安装路径}\plugins路径下的众多子目录下去搜索SWT.JAR文件,在找到的JAR文件中包含了SWT全部的Java类文件。因为SWT应用了JNI技术,因此同时也要找到相对应的JNI本地化库文件,由于版本和操作平台的不同,本地化库文件的名称会有些差别,比如SWT-WIN32-2116.DLL是Window平台下Eclipse Build 2116的动态库,而在Unix平台相应版本的库文件的扩展名应该是.so,等等。注意的是,Eclipse是一个开放源代码的项目,因此你也可以在这些目录中找到SWT的源代码,相信这会对开发很有帮助。下面是一段打开空窗口的代码(只有main方法)。
import com.e2one.example;
public class OpenShell{
public static void main(String [] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.open();
// 开始事件处理循环,直到用户关闭窗口
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
确信在CLASSPATH中包括了SWT.JAR文件,先用Javac编译例子程序。编译无错后可运行java -Djava.library.path=${你的SWT本地库文件所在路径} com.e2one.example.OpenShell,比如SWT-WIN32-2116.DLL件所在的路径是C:\swtlib,运行的命令应该是java -Djava.library.path=c:\swtlib com.e2one.example.OpenShell。成功运行后,系统会打开了一个空的窗口。
剖析SWT API
下面再让我们进一步分析SWT API的组成。所有的SWT类都用org.eclipse.swt做为包的前缀,下面为了简化说明,我们用*号代表前缀org.eclipse.swt,比如*.widgets包,代表的是org.eclipse.swt.widgets包。
我们最常用的图形构件基本都被包括在*.widgets包中,比如Button,Combo,Text,Label,Sash,Table等等。其中两个最重要的构件当数Shell和Composite。Shell相当于应用程序的主窗口框架,上面的例子代码中就是应用Shell构件打开一个空窗口。Composite相当于SWING中的Panel对象,充当着构件容器的角色,当我们想在一个窗口中加入一些构件时,最好到使用Composite作为其它构件的容器,然后再去*.layout包找出一种合适的布局方式。SWT对构件的布局也采用了SWING或AWT中Layout和Layout Data结合的方式,在*.layout包中可以找到四种Layout和与它们相对应的布局结构对象(Layout Data)。在*.custom包中,包含了对一些基本图形构件的扩展,比如其中的CLabel,就是对标准Label构件的扩展,上面可以同时加入文字和图片,也可以加边框。StyledText是Text构件的扩展,它提供了丰富的文本功能,比如对某段文字的背景色、前景色或字体的设置。在*.custom包中也可找到一个新的StackLayout布局方式。
SWT对用户操作的响应,比如鼠标或键盘事件,也是采用了AWT和SWING中的Observer模式,在*.event包中可以找到事件监听的Listener接口和相应的事件对象,例如常用的鼠标事件监听接口MouseListener,MouseMoveListener和MouseTrackListener,及对应的事件对象MouseEvent。
*.graphics包中可以找到针对图片、光标、字体或绘图的API。比如可通过Image类调用系统中不同类型的图片文件。通过GC类实现对图片、构件或显示器的绘图功能。
对不同平台,Eclipse还开发了一些富有针对性的API。例如,在Windows平台,可以通过*.ole.win32包很容易的调用ole控件,这使Java程序内嵌IE浏览器或Word、Excel等程序成为可能!
更复杂的程序
下面让我们展示一个比上面例子更加复杂一些的程序。这个程序拥有一个文本框和一个按键,当用户点击按键的时候,文本框显示一句欢迎信息。
为了文本框和按键有比较合理的大小和布局,这里采用了GradLayout布局方式。这种布局是SWT中最常用也是最强大的布局方式,几乎所有的格式都可能通过GradLayout去达到。下面的程序也涉及到了如何应用系统资源(Color),以及如何释放系统资源。
private void initShell(Shell shell) {
//为Shell设置布局对象
GridLayout gShellLay = new GridLayout();
shell.setLayout(gShellLay);
//构造一个Composite构件作为文本框和按键的容器
Composite panel = new Composite(shell,SWT.NONE);
//为Panel指定一个布局结构对象。
这里让Panel尽可能的占满Shell,
也就是全部应用程序窗口的空间。
GridData gPanelData = new GridData(GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
panel.setLayoutData(gPanelData);
//为Panel也设置一个布局对象。文本框和按键将按这个布局对象来显示。
GridLayout gPanelLay = new GridLayout();
panel.setLayout(gPanelLay);
//为Panel生成一个背景色
final Color bkColor = new Color(Display.getCurrent(),200,0,200);
panel.setBackground(bkColor);
//生成文本框
final Text text = new Text(panel,SWT.MULTI|SWT.WRAP);
//为文本框指定一个布局结构对象,
这里让文本框尽可能的占满Panel的空间。
GridData gTextData = new GridData (GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
text.setLayoutData(gTextData);
//生成按键
Button butt = new Button(panel,SWT.PUSH);
butt.setText("Push");
//为按键指定鼠标事件
butt.addMouseListener(new MouseAdapter(){
public void mouseDown(MouseEvent e){
//当用户点击按键的时候,显示信息
text.setText("Hello SWT");
}
});
//当主窗口关闭时,会触发DisposeListener。这里用来释放Panel的背景色。
shell.addDisposeListener(new DisposeListener(){
public void widgetDisposed(DisposeEvent e) {
bkColor.dispose();
}
});
}
把这段代码中的方法initShell()加入到第一个打开空窗口的例子中,得到的是一段能成功运行的完整GUI应用程序。运行方法可参考第一个例子。
系统资源的管理
在一个图形化的操作系统中开发程序,都要调用系统中的资源,如图片、字体、颜色等。通常这些资源都是有限的,程序员务必非常小心的使用这些资源:当不再使用它们时,就请尽快释放,不然操作系统迟早会油尽灯枯,不得不重新启动,更严重的会导致系统崩溃。
SWT是用Java开发的,Java语言本身的一大优势就是JVM的"垃圾回收机制",程序员通常不用理会变量的释放,内存的回收等问题。那么对SWT而言,系统资源的操作是不是也是如此?答案是一个坏消息,一个好消息。
坏消息是SWT并没采用JVM的垃圾回收机制去处理操作系统的资源回收问题,一个关键的因素是因为JVM的垃圾回收机制是不可控的,也就是说程序员不能知道,也不可能做到在某一时刻让JVM回收资源!这对系统资源的处理是致命的,试想你的程序希望在一个循环语句中去查看数万张图片,常规的处理方式是每次调入一张,查看,然后就立即释放该图片资源,而后在循环调入下一张图片,这对操作系统而言,任何时刻程序占用的仅仅是一张图片的资源。但如果这个过程完全交给JVM去处理,也许会是在循环语句结束后,JVM才会去释放图片资源,其结果可能是你的程序还没有运行结束,操作系统已经宕掉。
但下面的好消息也许会让这个坏消息变得无关紧要。对于SWT,只需了解两条简单的"黄金"法则就可以放心的使用系统资源!之所以称为黄金法则,一是因为少,只有两条,二是因为它们出奇的简单。第一条是"谁占用,谁释放",第二条是"父构件被销毁,子构件也同时被销毁"。第一条原则是一个无任何例外的原则,只要程序调用了系统资源类的构造函数,程序就应该关心在某一时刻要释放这个系统资源。比如调用了
Font font = new Font (display, "Courier", 10, SWT.NORMAL);
那么就应该在不在需要这个Font的时候调用
font.dispose();

㈢ Eclipse报错 org.eclipse.swt.SWTError: No more handles

调研Jacoco,尝试用Eclipse打开源码——平时使用IDEA——Eclipse启动失败,log中提示 Caused by: org.eclipse.swt.SWTError: No more handles

You may be creating resources (such as Font, Image or GC objects) that you aren't correctly disposing. ——这个解释看起来靠谱。

官方这个issue的comment 有建议修改注册表:

准备按照这个提示操作。本机默认值为 2710

What is the cause of the "org.eclipse.swt.SWTError: No more handles" occurring in Process Designer

这里提到出现问题的原因可能是GDI对象过多。 https://blogs.solidworks.com/tech/2017/05/warning-solidworks-resources-running-low.html

打开任务管理器,在 详细信息 栏的表头右键进行 选择列 ,在弹出窗口里可以看到 GDI对象 、 用户对象 的列名。

注意Eclipse中打开的项目的报错信息,即使处理错误信息。我只是清理了错误日志,重新打开Eclipse又OK了。另外,重启大法也好使。

㈣ 如何在eclipse中查看SWT源码

使用Eclipse开发Java程序,有时候需要查看一下某个类的源码,这时我们可以这样做,
鼠标放到你要查询的类名上,按住Ctrl键+鼠标左键就可以了!
如果发现出现错误---查不到源码,那么此时还需要设置一下,把JDK安装目录下的src.zip配置一下,此文件就是Java类库的源码。
以JDK1.8为例,查看一下src.zip文件

如果发现找不到源代码,则进行设置

点击Attach Source按钮,弹出视图,把JDK下的src.zip文件传入点击OK即可

此时按住Ctrl+鼠标左键指向Java类库当中的类,就可以查看类的源代码

㈤ 有谁知道怎么在Eclipse中看到SWT的源代码。我把SWT的包导到了项目下还是看不到,求救啊!!!

你的项目可能是导出之后的,没有源代码.唯一办法是把.class文件反编译成.java文件.版本较高的Eclipse本身就有反编译功能,你就能看到了. 不知是不是这原因,试试看吧

㈥ 技术分析:使用Eclipse进行SWT编程(图)

The best way to predict the future is to invent it —Alan Kay 为什么要使用SWT? SWT是IBM开发一套跨平台的GUI开发框架 为什么IBM要创建另一种GUI呢?为什么他们不使用现有的Java GUI框架呢?要回答这些问题 我需要回到Java的早期时代 Sun已经创建了一套跨平台的GUI框架 AWT (Abstract Windowing Toolkit) 这个AWT框架使用了本地窗口组件(native widgets)不过它存在LCD问题 这个LCD问题导致了它失去主要的平台特性 换句话说 如果平台A有窗口组件 - 而平台B有窗口组件 - 那么这个跨平台的AWT框架只能提供这两个集合的交集 为了解决这个问题 Sun创建了一个新的框架使用模拟窗口组件(emulated widgets)来代替本地窗口组件(native widgets) 这个方法解决了LCD问题同时提供了丰富的窗口组件 不过也产生了其他的问题 例如 Swing应用程序不再和本地程序在样子上一致 虽然JVM有了很大的改善 但是Swing应用程序仍然存在它们本地配对物所没有的性能问题 而且 Swing应用程序消耗了太多的内存 故不适合用于PDA和移动电话等小型设备 IBM发现这些方法都无法满足他们的需求 因此 IBM创建了新的GUI库叫做SWT 它解决了AWT和Swing框架中的问题 SWT框架使用JNI访问本地窗口组件(native widgets) 如果一个窗口组件在主机平台上不能获得 那么SWT会模拟这个不能获取的窗口组件 一个SWT应用程序的基础材料 Display Shell和Widgets是一个SWT应用程序的基础材料 Displays用于管理事件循环(event loops)和控制UI线程和其他线程之间的通讯 Shell是应用程序中由操作系统窗体管理器来管理的窗体 任何SWT应用程序都需要至少一个Display实例和 个或更多的Shell实例 图 说明了一个SWT应用程序的不同看法 第一幅图是简化的UI对象的继承图 第二幅图是UI对象的包含结构 第三幅图就是创建了的UI 如果一个应用程序使用多个线程 每个线程使用自己的Display对象实例 那么你可以通过使用静态的Display getCurent()方法得到当前活跃的Display对象实例 一个Shell表示一个特别操作系统中的一个窗口 一个Shell可以最大化 正常化 和最小化 有两种类型的shell 一种是顶层(top level)Shell作为Display的主窗口创建的 另一种是依赖于其他shell的对话shell Shell的类型是由传给Shell构造函数的style位决定的 Shell的默认值是对话Shell 也就是说 如果没有传递任何值给构造函数参数 那么创建的是默认的对话Shell 如果一个Display对象作为参数 那么它是顶层(top level)Shell 有些窗口组件(widget)的属性必须在创建时设定 这些窗口组件(widget)属性叫做style bits Style bits是在SWT类中定义的常量 如Button button = new Button( shell ) 当然可以通过或操作|来使用多个style bit 例如 要使用一个有边的按钮 你需要使用SWT PUSH | SWT BORDER作为style bit参数 环境设置 开发一个SWT应用程序与开发一个Swing应用程序不同 为了可以开始一个SWT应用程序的开发 你需要把SWT库加到classpath中 同时设置好对应的必要的环境变量 第一个需要的库是swt jar文件 它位于ECLIPSE_HOMEeclipseplugins eclipse swt win _ wswin 目录 根据你使用的Eclipse版本 你可能需要使用不同的目录 这个swt jar文件必须加到你的classpath中 为此到Project >Properies >JavaBuildPath >Libraries >Add Variable > Eclipse Home >Extend并按上述路径选择swt jar库 然后单击OK 然后 你可以编译SWT应用程序 但是由于抛出下边所示的运行时异常 无法运行它 因为swt jar使用了本地库 你需要设置java library path环境变量来在Java中使用本地库 ecity cn/img_ / / / jpg > 要设置java library path变量 到Run > Run > Java Applicaton > New >Arguments > VM Arguments 然后 如何需要 如下修改path 把它粘贴到VM Arguments部分 Djava library path=c:eclipseplugins eclipse swt win _ oswin x 装载本地库如果你需要装载应用程序使用的任何本地库 你可以使用Runtime getPlatform loadLibrary( libraryname )方法 完成这些步骤 你就可以在你的eclipse环境下运行SWT程序了 你的第一个SWT应用程序 创建一个典型的SWT应用程序需要一下步骤 创建一个Display创建一个或多个Shells设置Shell的Layout manager创建Shell中的widgets开启Shell窗口写一个事件转发循环销毁display你可以使用下边的代码模板来快速的运行本文中的代码片断 你可以复制粘贴这些代码至合适的区域 如源代码 所示 ecity cn/img_ / / / jpg > 这个例子显示了一个空的窗口 你可以加widget到上边的模板 任何SWT应用程序需要 一个Display和一个或多个 Shells 这个Shell是个合成对象;它可以容纳其他的合成对象 如果没有设置shell的 layout 加到Shell的widget是不能看见的 Shell窗口必须 打开才能显示 事件处理循环读取并转发GUI事件 如果没有事件处理循环应用程序窗口是无法显示的 即使通过open()方法来打开Shell窗口 让后 需要在Shell被丢弃的时候销毁 Display 导入需要的库 你可以使用Source >Organize Imports菜单或者Ctrl+Shift+O来自动导入需要的库 lishixin/Article/program/Java/ky/201311/28075

热点内容
搜狐视频破解缓存 发布:2025-05-10 15:39:06 浏览:805
存储器主要用来 发布:2025-05-10 15:17:34 浏览:427
两台服务器怎么部署redis 发布:2025-05-10 15:16:09 浏览:903
cocoa编程 发布:2025-05-10 15:15:18 浏览:181
中控导航什么配置好 发布:2025-05-10 15:15:07 浏览:790
个人网站的数据库 发布:2025-05-10 15:10:17 浏览:119
会编程好处 发布:2025-05-10 14:58:49 浏览:480
编程的过程 发布:2025-05-10 14:58:38 浏览:343
怎么退出服务器开机硬件监控 发布:2025-05-10 14:53:37 浏览:232
长虹安卓电视关闭网络在哪里 发布:2025-05-10 14:37:04 浏览:143