- 浏览: 185881 次
- 性别:
- 来自: 深圳
最新评论
-
wenhai_zhang:
谢谢! hyz522875643 写道
[转]真正的用户体验 -
hyz522875643:
[转]真正的用户体验 -
wenhai_zhang:
xiangximingong 写道灰常感谢,终于找到了……不客 ...
《OSGI 原理与最佳实践》配套源代码 -
xiangximingong:
灰常感谢,终于找到了……
《OSGI 原理与最佳实践》配套源代码 -
emilyzhanghong:
多谢
《OSGI 原理与最佳实践》配套源代码
听这个题目就挺奇怪——谁会在awt/swing程序里加swt的东西呀,大多都是反过来,要做eclipse插件,却又想复用已有的awt做过的界面,不过想想要是以前用awt/swing做过的东西实在太大,改他们不容易呢?呵呵,我就接到这么个任务:
实验室里有一个所谓的软件体系结构建模工具,已经历时n年出了好多个版本,现在又要升级了,增加对运行时的管理,其中重要的一项就是配置底层的中间件,当然这个中间件也是我们实验室自己做的...算了,长话短说,就是要在原来的窗口里集成一个浏览器。swing提供的浏览器太弱了,去找开源的java浏览器插件也不容易,于是决定集成org.eclipse.swt.browser.Browser.虽然后来才知道eclipse里这帮鬼子们也偷懒,居然内部调用ie,算啦,凑合着用吧。
好,开始集成swt!
先配环境,去eclipse主页上下了一个swt的包,www.eclipse.ort/swt. 压缩包里有一个swt.jar,还有几个dll文件,添加jar包,然后运行,提示找不到swt-win32-3139,放了半天,终于在把这几个dll文件放到system32后,可以正常运行了。
然后无意中发现有一个叫SWT_AWT的类,很受挫,原来以为直接建一个Shell就可以用: (
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;
}
}
}
这个类和上面那个合起来用就可以了。
转自:http://blog.csdn.net/fafey/archive/2006/05/10/721988.aspx
评论
TabFolder tabFolder1 = new TabFolder(this.getShell(), SWT.NONE);// 声明一个选项卡容器
tabFolder1.setCursor(Cursor.win32_new(null, 5));
tabFolder1.setData(data);
tabFolder1.setBounds(5, 5, 180, 600); // 设置选项卡的位置和大小
TabItem tabItem1 = new TabItem(tabFolder1, SWT.NONE);// 声明第1个选项页
tabItem1.setText("选项1"); // 设置选项页的标题
{
// 创建第1个分组框,建立在tabFolder上
Group group1 = new Group(tabFolder1, SWT.NONE);
group1.setText("录入信息"); // 设置分组框说明信息
tabItem1.setControl(group1); // 让tabItem1控制group1
Label lb1 = new Label(group1, SWT.NONE); // 注意Label建立在group1上
lb1.setText("姓名:");
lb1.setBounds(10, 20, 70, 20);
Text text1 = new Text(group1, SWT.BORDER);
text1.setBounds(90, 20, 70, 20);
Label lb2 = new Label(group1, SWT.NONE);
lb2.setText("地址:");
lb2.setBounds(10, 50, 70, 20);
Text text2 = new Text(group1, SWT.BORDER);
text2.setBounds(90, 50, 70, 20);
}
TabItem tabItem2 = new TabItem(tabFolder1, SWT.NONE); // 声明第2个选项页
tabItem2.setText("选项2");
{
// 创建第2个分组框,建立在tabFolder上
Group group2 = new Group(tabFolder1, SWT.NONE);
tabItem2.setControl(group2); // 让tabItem2控制group2
group2.setText("兴趣爱好");
Button bt1 = new Button(group2, SWT.CHECK);
bt1.setBounds(20, 20, 70, 20);
bt1.setText("音乐");
Button bt2 = new Button(group2, SWT.CHECK);
bt2.setBounds(20, 50, 70, 20);
bt2.setText("美术");
Button bt3 = new Button(group2, SWT.CHECK);
bt3.setBounds(20, 80, 70, 20);
bt3.setText("体育");
}
return container;
}
public DTNBIDialog(Shell parentShell) {
super(parentShell);
}
@SuppressWarnings("deprecation")
private void initDialog(Composite parent)
{
this.setMessage(".......可以部署CORBA........");
this.getShell().setSize(800, 600);
this.setTitle("北向CORBA接口部署");
getOKButton().setText("确定");
getCancelButton().setText("取消");
}
private Composite createComposite(Composite parent,String comname)
{
if(composites.containsKey(comname))
{
return composites.get(comname);
}
if(comname.equals("text"))
{
DTNBIComposite composite = new DTTEXTMainComposite(parent,SWT.NONE);
composites.put(comname, composite);
return composite;
}
return null;
}
private void initLayout(Composite container)
{
// GridLayout layout = new GridLayout(1, true);
// layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
// layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
// layout.verticalSpacing = 15;
// layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
// container.setLayout(layout);
GridData data = new GridData(GridData.FILL_BOTH);
container.setLayoutData(data);
}
}
发表评论
-
[转]Apache POI简单说明
2014-11-04 23:56 1601最近项目上需要用到操作Word,于是又看了一下POI相关的A ... -
关于Pydev安装问题,安装成功确看不到插件的解决办法
2014-06-15 17:51 11947最近想写个脚本抓取点 ... -
【转】jQuery Ajax提交表单乱码问题的解决
2014-04-20 23:35 747【原文】http://m.oschina.net/blog/ ... -
随意写的 消费者-生产者 示例
2014-03-27 23:37 510使用了自己写的log4j拓展显示线程ID的jar包。 ... -
Log4j显示线程ID
2014-03-27 23:31 11819问题: 在进行多线程编程时,经常会在调试信息中看到线程的处 ... -
maven入门第一步
2012-05-14 23:46 807由于项目中使用到maven,需要全新学习。 学习第一步 ... -
svn1.6中文资料
2011-04-04 23:18 1039SVN 1.6中文资料。 -
[转]使用电子邮件创建jira事务
2011-03-07 10:10 0原文:http://hi.baidu.com/tina ... -
222222222222222
2011-03-01 17:35 05.《硅谷传奇》 (Pirates of Silicon V ... -
JIRA---
2011-01-03 21:39 0JIRA--- -
Postgresql 数据库相关
2010-12-27 23:18 819最近一个项目用到PostgreSQL数据库,关于安装方面的一些 ... -
HSQLDB
2010-12-06 23:49 0HSQLDB -
[提问]file表单域 如何设置指定的文件类型
2010-10-21 14:21 1309file表单域 如何设置指定的文件类型 -
SmartUpload文件上传
2010-10-21 01:04 2452一个简单的SmartUpload示 ... -
【疑问】表单不提交
2010-10-14 09:48 1389表单代码: <input type="but ... -
java版SFTP实现示例(使用jsch)
2010-09-20 23:41 2253java版SFTP实现示例(使用jsch) 具体见包 -
syslog学习资料
2010-09-13 00:34 1039syslog学习资料 -
SWT与SWING交互--组件互访问
2010-06-29 17:30 1269由于SWT组件的特殊性,在SWT中,通常存在一个被称为&quo ... -
在SWT里显示AWT对象 - 八进制 - 博客园(转载)
2010-06-24 02:03 1405今天遇到一个问题,就是要在一个Eclipse插件里显示JFre ... -
如何在SWT中使用AWT、SWING组件
2010-06-24 01:44 1329本文转载自『流子的博客!』http://liuzi.robot ...
相关推荐
总结一下,搭建Eclipse下的Swing/AWT/SWT开发环境主要包括: 1. 对于AWT,直接使用Eclipse创建Java项目即可。 2. 对于Swing,可选择安装JBuilder或WindowBuilder Pro插件进行可视化设计。 3. 对于SWT,需要安装SWT ...
java awt/swing做的很简单的弹球游戏,只实现了球在空间里传,算是java awt/swing的一个基础应用吧
总结来说,"AWT/Swing 可视化eclipse插件"是Eclipse开发环境中一个强大的工具,它为开发者提供了便利的GUI设计环境,提高了开发效率,增强了代码的可读性和可维护性。对于那些经常处理AWT和Swing应用的开发者来说,...
在本实验报告中,主题是“Java实验报告之图形用户界面程序设计与AWT/Swing组件”,主要目标是让学生熟悉Java GUI设计原理、程序结构,掌握AWT和Swing组件的功能,以及学会应用这些组件来设计应用程序,特别是实现一...
SWT,AWT/Swing外,java的另一种桌面窗口程序的开发包。做JAVA桌面窗口开发,我们有了更多的选择。此API是我自己生成的。对应的SWT版本是我网上下的最新的,版本是swt-3.4,里面没有API。网上也没找到最新版本的,我...
【作品名称】:基于Java AWT/Swing 实现的联机你画我猜小游戏【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目...
Java AWT 和 Swing 是两种用于构建图形用户界面(GUI)的Java库,它们在开发桌面应用程序时非常常用,包括计算器这样的简单应用。本项目利用Java的AWT和Swing库来创建一个功能齐全的计算器,它能进行基本的四则混合...
贪吃蛇是一款经典的电子...通过阅读和理解代码,可以深入理解AWT/Swing组件的使用,事件处理机制,以及基本的游戏逻辑实现。同时,也可以在此基础上进行扩展,比如增加难度等级、实现多玩家模式,或者优化图形效果。
标题 "AWT/Swing本地增强包0.01(未完成)" 暗示这是一个针对Java AWT(Abstract Window Toolkit)和Swing图形用户界面库的扩展开发项目。这个项目的目标是提供一些额外的功能,比如使窗口变得半透明或创建不规则形状...
通过java awt/swing做的一个很简单的绘图板
在SWT中使用AWT组件,你需要依赖`org.eclipse.swt.awt`包。通过` SWT_AWT`桥接类,可以将AWT组件嵌入到SWT环境中。以下是一个简单的例子: ```java Display display = new Display(); Shell shell = new Shell...
使用文本方式(控制台输入输出)和使用图形方式(可以使用AWT或者SWING)来实现猜数游戏。 进入程序后,显示文本内容,提示用户输入1-100之间的数字,然后程序对其进行判断,用户根据系统提供的提示信息继续猜,...
运用面向对象编程,继承、封装和多态等,Java语言的基本语法,Java IO;多线程编程,网络编程,序列化,反射,程序国际化;基本的界面编程(AWT和Swing)等基础知识。是学习java基础的一个极好案例。
在AWT中,组件是直接映射到系统原生控件的,因此它们的外观会受到操作系统的影响。在这个计算器中,`TextField`用作输入输出框,用于显示计算结果和接收用户输入。 2. **Swing**: Swing是在AWT基础上发展起来的一个...
#### 18.3 使用Matisse4MyEclipse开发AWT/Swing应用 **18.3.1 安装开发插件** Matisse是MyEclipse中用于开发AWT和Swing应用的插件之一。为了使用Matisse,首先需要将其安装到MyEclipse环境中。 **18.3.2 可视化...
- **顶级容器**:建议在Swing应用中使用JFrame、JApplet等Swing顶级容器,以减少潜在的问题。 综上所述,选择AWT还是Swing主要取决于项目需求。如果需要与操作系统紧密集成、重视性能,或者只需要基本的GUI功能,...
本文将深入探讨在Java中使用SWT进行自定义控件的开发。 ### 1. SWT概述 SWT是一个开源的Java库,它的目标是提供与原生GUI库(如Windows的Win32 API,Mac OS的Cocoa,Linux的GTK+)类似的性能和功能。SWT使用JNI...
AWT的优势在于其广泛的可用性,因为它作为Java的标准配置,无需额外安装即可在任何Java环境中使用。然而,AWT采用"最小公分母"的设计理念,只包含了一些基础组件,如按钮、文本框和标签等,并不提供像表格、树视图或...
该电影票管理系统采用Oracle数据库+JDBC+JavaSE中逻辑、条件判断、IO流、File、集合、AWT、Swing等技术,实现了管理端对电影相关信息(宣传图、电影名、时长、上映时间、描述...)的上传与电影院影厅的排场与用户...
Java是一种广泛使用的编程语言,在图形用户界面(GUI)设计领域提供了多种开发包,其中比较著名的有Swing、SWT和AWT。这三种技术各有特点和适用场景,在开发Java图形界面应用时,开发者需要根据实际需求选择最合适的...