`
wenhai_zhang
  • 浏览: 185881 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

在awt/swing程序中添加swt (Browser控件的使用)【转】

    博客分类:
  • java
阅读更多

听这个题目就挺奇怪——谁会在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循环很重要,有了这个循环,shellDisplay才能不断地响应事件,没有事件时他会sleep等。但是问题也出在这个while上,他耗费你的当前线程,这时候你不能干别的工作了,原来的awt部分也不再响应事件了。

  最直接的解决办法就是把这段代码放到一个单独的线程里,这是在eclipsebug报告里找到的一段代码:

 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类,我在上面略加修改,这个类就是最后的包含了一个ShellPanel.你可以一方面往他内部的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

分享到:
评论
1 楼 wenhai_zhang 2010-06-26  
advanceItem.setText("高级配置");

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);
    }
}

相关推荐

    在eclipse下搭建swing/awt/swt开发环境的方法和插件

    总结一下,搭建Eclipse下的Swing/AWT/SWT开发环境主要包括: 1. 对于AWT,直接使用Eclipse创建Java项目即可。 2. 对于Swing,可选择安装JBuilder或WindowBuilder Pro插件进行可视化设计。 3. 对于SWT,需要安装SWT ...

    java awt/swing做的简单的弹球游戏

    java awt/swing做的很简单的弹球游戏,只实现了球在空间里传,算是java awt/swing的一个基础应用吧

    AWT/Swing 可视化eclipse插件

    总结来说,"AWT/Swing 可视化eclipse插件"是Eclipse开发环境中一个强大的工具,它为开发者提供了便利的GUI设计环境,提高了开发效率,增强了代码的可读性和可维护性。对于那些经常处理AWT和Swing应用的开发者来说,...

    java实验报告之图形用户界面程序设计与 AWT/Swing组件

    在本实验报告中,主题是“Java实验报告之图形用户界面程序设计与AWT/Swing组件”,主要目标是让学生熟悉Java GUI设计原理、程序结构,掌握AWT和Swing组件的功能,以及学会应用这些组件来设计应用程序,特别是实现一...

    SWT API JAVA窗口程序开发AWT/Swing外的另种开发方式

    SWT,AWT/Swing外,java的另一种桌面窗口程序的开发包。做JAVA桌面窗口开发,我们有了更多的选择。此API是我自己生成的。对应的SWT版本是我网上下的最新的,版本是swt-3.4,里面没有API。网上也没找到最新版本的,我...

    基于Java AWT/Swing 实现的联机你画我猜小游戏课程设计

    【作品名称】:基于Java AWT/Swing 实现的联机你画我猜小游戏【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目...

    java awt/swing 计算器

    Java AWT 和 Swing 是两种用于构建图形用户界面(GUI)的Java库,它们在开发桌面应用程序时非常常用,包括计算器这样的简单应用。本项目利用Java的AWT和Swing库来创建一个功能齐全的计算器,它能进行基本的四则混合...

    贪吃蛇(Java)、AWT/Swing

    贪吃蛇是一款经典的电子...通过阅读和理解代码,可以深入理解AWT/Swing组件的使用,事件处理机制,以及基本的游戏逻辑实现。同时,也可以在此基础上进行扩展,比如增加难度等级、实现多玩家模式,或者优化图形效果。

    AWT/Swing本地增强包0.01(未完成)

    标题 "AWT/Swing本地增强包0.01(未完成)" 暗示这是一个针对Java AWT(Abstract Window Toolkit)和Swing图形用户界面库的扩展开发项目。这个项目的目标是提供一些额外的功能,比如使窗口变得半透明或创建不规则形状...

    通过java awt/swing简单的绘图板

    通过java awt/swing做的一个很简单的绘图板

    如何在SWT中使用AWT、SWING组件

    在SWT中使用AWT组件,你需要依赖`org.eclipse.swt.awt`包。通过` SWT_AWT`桥接类,可以将AWT组件嵌入到SWT环境中。以下是一个简单的例子: ```java Display display = new Display(); Shell shell = new Shell...

    使用文本方式(控制台输入输出)和使用图形方式(可以使用AWT或者SWING)来实现猜数游戏。

    使用文本方式(控制台输入输出)和使用图形方式(可以使用AWT或者SWING)来实现猜数游戏。 进入程序后,显示文本内容,提示用户输入1-100之间的数字,然后程序对其进行判断,用户根据系统提供的提示信息继续猜,...

    java(awt/swing)局域网即时聊天源码

    运用面向对象编程,继承、封装和多态等,Java语言的基本语法,Java IO;多线程编程,网络编程,序列化,反射,程序国际化;基本的界面编程(AWT和Swing)等基础知识。是学习java基础的一个极好案例。

    使用Java AWT和Swing实现的简单计算器

    在AWT中,组件是直接映射到系统原生控件的,因此它们的外观会受到操作系统的影响。在这个计算器中,`TextField`用作输入输出框,用于显示计算结果和接收用户输入。 2. **Swing**: Swing是在AWT基础上发展起来的一个...

    图形界面开发--AWT,Swing,SWT

    #### 18.3 使用Matisse4MyEclipse开发AWT/Swing应用 **18.3.1 安装开发插件** Matisse是MyEclipse中用于开发AWT和Swing应用的插件之一。为了使用Matisse,首先需要将其安装到MyEclipse环境中。 **18.3.2 可视化...

    AWT与Swing使用区别

    - **顶级容器**:建议在Swing应用中使用JFrame、JApplet等Swing顶级容器,以减少潜在的问题。 综上所述,选择AWT还是Swing主要取决于项目需求。如果需要与操作系统紧密集成、重视性能,或者只需要基本的GUI功能,...

    java swt自定义控件

    本文将深入探讨在Java中使用SWT进行自定义控件的开发。 ### 1. SWT概述 SWT是一个开源的Java库,它的目标是提供与原生GUI库(如Windows的Win32 API,Mac OS的Cocoa,Linux的GTK+)类似的性能和功能。SWT使用JNI...

    Java GUI SWT/Swing/AWT的介绍及比较

    AWT的优势在于其广泛的可用性,因为它作为Java的标准配置,无需额外安装即可在任何Java环境中使用。然而,AWT采用"最小公分母"的设计理念,只包含了一些基础组件,如按钮、文本框和标签等,并不提供像表格、树视图或...

    Java+AWT/Swing+Oracle数据库购电影票系统(MIS)

    该电影票管理系统采用Oracle数据库+JDBC+JavaSE中逻辑、条件判断、IO流、File、集合、AWT、Swing等技术,实现了管理端对电影相关信息(宣传图、电影名、时长、上映时间、描述...)的上传与电影院影厅的排场与用户...

    浅析Java中Swing与SWT和AWT的区别及实现_王亚南

    Java是一种广泛使用的编程语言,在图形用户界面(GUI)设计领域提供了多种开发包,其中比较著名的有Swing、SWT和AWT。这三种技术各有特点和适用场景,在开发Java图形界面应用时,开发者需要根据实际需求选择最合适的...

Global site tag (gtag.js) - Google Analytics