在SWING里嵌入SWT的组件
http://zhanghan3366.blog.163.com/blog/static/6966305220110505351568/
————————————————————————————————————————————————————————————————————————————
先配环境,去eclipse主页上下了一个swt的包,www.eclipse.ort/swt. 压缩包里有一个swt.jar,还有几个dll文件。
有 一个叫SWT_AWT的类, SWT_AWT的思想简单说就是利用一个AWT里的Canvas建立一个Shell,然后就可以往这个Shell里添swt的东西了,至于canvas放 在哪就无所谓了,可能在一个单独的窗口里,也可在某个大窗口的一部分中。我在网上找到了一段日本鬼子写的代码,可以说明这个类大概的用法:
JFrame frame = new JFrame();
Container cp = frame.getContentPane();
Canvas canvas = new Canvas();
cp.add(canvas,BorderLayout.CENTER);
frame.setVisible(true);
Display display = new Display();
Shell shell = SWT_AWT.new_Shell(display,canvas);
shell.setLayout(new FillLayout());
Button button = new Button(shell,SWT.PUSH);
button.setText("SWTのボタン");
shell.pack();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()){
display.sleep ();
}
}
后面那个while循环很重要,有了这个循环,shell的Display才能不断地响应事件,没有事件时他会sleep等。但是问题也出在这个while上,他耗费你的当前线程,这时候你不能干别的工作了,原来的awt部分也不再响应事件了。
最直接的解决办法就是把这段代码放到一个单独的线程里,这是在eclipse的bug报告里找到的一段代码:
private class DisplayThread extends Thread {
private Display display;
public void run() {
display = Display.getDefault();
swtEventLoop();
}
private void swtEventLoop() {
while( true ) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
public Display getDisplay() {
return display;
}
}
它还给了一个panel类,我在上面略加修改,这个类就是最后的包含了一个Shell的Panel.你可以一方面往他内部的shell中添各种swt的东
西,也可以把整个类作为一个panel插到任何awt部分中。还有一个值得注意的是,这里用的是Panel,而不是JPanel,按eclipse文档的
解释,“强烈建议使用一个 heavyweight component 作为根控件”。
public class SWTPane extends Panel {
DisplayThread displayThread;
private Canvas canvas;
public SWTPane() {
displayThread=new DisplayThread();
displayThread.start();
canvas = new Canvas();
setLayout( new BorderLayout() );
add( canvas, BorderLayout.CENTER );
}
public void addNotify() {
super.addNotify();
Display dis=displayThread.getDisplay();
dis.syncExec( new Runnable() {
public void run() {
Shell shell = SWT_AWT.new_Shell(displayThread.getDisplay(), canvas );
shell.setLayout( new FillLayout() );
final Browser browser = new Browser(shell, SWT.NONE);
browser.setLayoutData(BorderLayout.CENTER);
browser.setUrl("http://blog.csdn.net/fafey");
}
} );
}
}
其中dis.syncExec这个函数的意思是让display根据自己所在线程的情况,找一个合适的时机执行后面提供的代码。
但是这个代码也有问题,运行时在这个地方抛出NullPointerException
我觉得可能是因为在线程还没有建立好之前,先调用了getDisplay(),返回了一个null,没办法,在线程中增加同步机制吧!
public class DisplayThread extends Thread {
private Display display;
Object sem=new Object();
public void run() {
synchronized (sem){
display = Display.getDefault();
sem.notifyAll();
}
swtEventLoop();
}
private void swtEventLoop() {
while( true ) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
public Display getDisplay() {
try{
synchronized (sem){
while(display==null)
sem.wait();
return display;
}
}
catch(Exception e){
return null;
}
}
}
这个类和上面那个合起来用就可以了。
在SWING里嵌入SWT的组件的更多相关文章
- 关于SWT常用组件(按钮,复选框,单选框(Button类))
Button是SWT中最常用的组件.Button类的继承关系图: Button类的构造方法是newe Button(Composite parent,int style)它有两个参数: 第一个参数:是 ...
- 网页内嵌入QQ通信组件,唤起QQ,针对不同平台的处理方式
web浏览器中嵌入QQ通信组件,目前发现有两种方式,主要是区分 IOS平台(苹果系列)和其他平台(PC 安卓等……),下面是代码区别: <li><a href="http: ...
- paip.提升效率--gui 的选择--swing最佳实践swt awt
paip.提升效率--gui 的选择--swing最佳实践swt awt ////////////////弹出消息框. ////////////////myeclipse swing 开发最佳实践.. ...
- 在JavaScript里嵌入大量字符串常量的方法
[转]在JavaScript文件里嵌入大量字符串常量是经常遇到的事.有时为了省事,就把一些界面的HTML和CSS直接写在JS文件里.数量少还好,多的话就密密麻麻的一坨文字,讲究美观的文艺青年们,会用大 ...
- vue里在自定义的组件上定义的事件
事件分为原生事件和自定义事件. vue里在自定义的组件上定义的事件,都被认为是自定义事件,必须用$emit()来触发. 这也是子组件向父传值的原理. 如果想作为原生事件,需要在原生事件后面加上.nat ...
- angular里使用vue/vue组件怎么在angular里用
欢迎加入前端交流群交流知识&&获取视频资料:749539640 如何在angularjs(1)中使用vue参考: https://medium.com/@graphicbeacon/h ...
- Android H5混合开发(3):原生Android项目里嵌入Cordova
前言 如果安卓项目已经存在了,那么如何使用Cordova做混合开发? 方案1(适用于插件会持续增加或变化的项目): 新建Cordova项目并添加Android平台,把我们的安卓项目导入Android平 ...
- 原生Android项目里嵌入Cordova
Android H5混合开发():原生Android项目里嵌入Cordova 如果安卓项目已经存在了,那么如何使用Cordova做混合开发? 方案1(适用于插件会持续增加或变化的项目): 新建Cord ...
- eclipse里打开SWT项目找不到source/design的图形UI设计界面
因为前天重新装了个新版的eclipse, 结果今天打开一个SWT的项目,突然找不到source/design的图形UI设计的两个切换按钮 我把SWT组件重新装了还是找不到.结果后来发现是因为重装ecl ...
随机推荐
- 动态获取项加入到SQL中去统计
public static List<CustomerAppraisalInfo> ListCustomerAppraisal(int pageIndex, int pageSize, s ...
- Smart210学习记录------linux串口驱动
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=27025492&id=327609 一.核心数据结构 串口驱动有 ...
- TCP发送接口的返回值
原文链接: http://blog.csdn.net/ordeder/article/details/17240221 1. TCP发送接口:send() TCP发送数据的接口有send,write, ...
- 对于unallocated space的翻译 我想说几句话
在sqlserver中,当我们使用sp_spaceused查看数据库空间使用情况的时候 会看到属性unallocated space.所有的中文翻译都是“未保留供数据库对象使用的数据库空间”, 作为中 ...
- UML常用图的几种关系的总结
在UML的 类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization), 关联(Association), 聚合(Aggregation), 组合(Com ...
- 合并excel-MergeExcel
MergeExcel 将需要合并的excel放入该目录下,包含xls和xlsx 点击运行按钮: 输入包含多少列: 等待运行,完毕! 基于python编写,源码和exe于 TTyb
- Zookeeper安装指南
第一步:修改conf目录下面的 zoo_sample.cfg修改为zoo.cfg tickTime=2000 # The number of ticks that the initial # sync ...
- SSIS 参数与环境
微软 BI 系列随笔 - SSIS 基础 - 参数与环境 简介 在上一篇博客中,主要讲述了如何实现SSIS的项目部署,参见 微软 BI 系列随笔 - SSIS 2012 基础 - SSIS 项目部署模 ...
- python中使用xlrd、xlwt操作excel表格详解
python读excel——xlrd 这个过程有几个比较麻烦的问题,比如读取日期.读合并单元格内容.下面先看看基本的操作: 首先读一个excel文件,有两个sheet,测试用第二个sheet,shee ...
- linux 下 用户与用户组
1,增加一个test组:groupadd test 2,将test组重命名test2:groupmod -n test2 test 3,删除test2组:groupdel test2 4,查看当前登录 ...