http://blog.51cto.com/redking/66421

简介:
创建插件项目
1.        选择主菜单“文件→新建→项目”命令,在弹出窗口中选择“插件开发→插件项目”,单击“下一步”按钮。

2.        进入下一个窗口,填入项目名myswt,单击“下一步”按钮。
3.        进入到下一个窗口,接受所有默认值,直接单击“完成”按钮。
4.        完成创建向导后,可以看到Eclipse中多了一个myswt项目,其中“插件依赖项”已经对支持SWT项目所需的jar包做好了引用。Src下的myswt包还用不到,这里将它删除掉。
 
 
创建HelloWorld程序
myswt创建com.michael.swt包,在此包下创建一个HelloWorld类,然后把这个类改造为一个简单的SWT程序。
代码内容如下:
package  com.michael.swt;

import  org.eclipse.swt.widgets.Display;

import  org.eclipse.swt.widgets.Shell;

public   class  HelloWorld {

 

     /**

      *   @param   args

      */

     public   static   void  main(String[] args) {

         //Display 负责管理事件循环和控制UI线程和其他线程之间的通信

         final  Display display=Display.getDefault();

         final  Shell shell= new  Shell();  //shell 是程序的主窗口

        shell.setSize(327,253); // 设置主窗口的大小

        shell.setText( "HelloWorld" ); // 设置主窗口的标题

         //------- 创建窗口中的其他界面组件----------

         //.......

         //-------END---------

        shell.layout(); // 应用界面布局

        shell.open(); // 打开shell主窗口

         while  (!shell.isDisposed()){ // 如果shell主窗口没有关闭,则一直循环

             if (!display.readAndDispatch())  // 如果display不忙,就让display处于休眠状态

                display.sleep();

        }

        display.dispose();  // 释放display资源

    }

 

}

从代码中可以看到SWT程序的几个特点:
它需要一个Display对象来支撑SWT界面的显示;
Shell是主窗口,其他所有界面组件(如按钮、文本框等)都创建于其中。
虽然这个程序涉及Display多线程操作,但在实际SWT编程中却很少关心这方面,基本是照搬同样的代码。
 
运行HelloWorld
选择主菜单“运行→运行方式→SWT应用程序”命令来运行HelloWorld.java,运行显示的是一个空白窗口。

 
 
HelloWorld更进一步

上面的HelloWorld程序比较简单,现在给界面加入一个按钮,当单击该按钮时能弹出一个对话框,要实现这个效果,在原HelloWorld类的省略号处加入如下代码:
Button button =  new  Button(shell,SWT.NONE);  // 创建一个按钮对象

button.setText(HelloWorld);  // 设置按钮上的文字

button.setBounds(88,94,100,25);  // 设置按钮在窗口中的位置和大小

// 编写按钮被单击时的事件代码

button.addSelectionListener( new  SelectionAdapter(){

         public   void  widgetSelected(SelectionEvent e){

         // 弹出一个对话框,MessageDialogJFace中的类

        MessageDialog.openinformation(shell, "hello" , "HelloWorld" );

        }

})

代码还需要用Ctrl+Shift+O快捷键加入相关类的import语句,这时候要注意Button不要导入AWTjava.awt.Button,而应该导入SWTorg.eclipse.swt.widgets.Button.以后在写SWT程序时都要注意这个问题。代码修改后的运行效果下图。
完整代码如下:
package  com.michael.swt;

import  org.eclipse.swt.widgets.Display;

import  org.eclipse.swt.widgets.Shell;

import  org.eclipse.swt.SWT;

import  org.eclipse.swt.events.SelectionAdapter;

import  org.eclipse.jface.dialogs.MessageDialog;

import  org.eclipse.swt.events.SelectionEvent;

import  org.eclipse.swt.widgets.Button;

public   class  HelloWorld {

     /**

      *   @param   args

      */

     public   static   void  main(String[] args) {

         //Display 负责管理事件循环和控制UI线程和其他线程之间的通信

         final  Display display=Display.getDefault();

         final  Shell shell= new  Shell();  //shell 是程序的主窗口

        shell.setSize(327,253); // 设置主窗口的大小

        shell.setText( "HelloWorld" ); // 设置主窗口的标题

         //------- 创建窗口中的其他界面组件----------

        Button button =  new  Button(shell,SWT. NONE );  // 创建一个按钮对象

        button.setText( "HelloWorld" );  // 设置按钮上的文字

        button.setBounds(88,94,100,25);  // 设置按钮在窗口中的位置和大小

         // 编写按钮被单击时的事件代码

        button.addSelectionListener( new  SelectionAdapter(){

             public   void  widgetSelected(SelectionEvent e){

                 // 弹出一个对话框,MessageDialogJFace中的类

                MessageDialog.openInformation(shell, "hello" , "HelloWorld" );

            }

        });

         //-------END---------

        shell.layout(); // 应用界面布局

        shell.open(); // 打开shell主窗口

         while  (!shell.isDisposed()){ // 如果shell主窗口没有关闭,则一直循环

             if (!display.readAndDispatch())  // 如果display不忙,就让display处于休眠状态

                display.sleep();

        }

        display.dispose();  // 释放display资源

    }

}

 

注意:

虽然Shell的类定义中没有final前缀,但我们依然不能不继承Shell类,因为Shell的父类Decorations有一个checkSubclass()方法,继承Shell的类都会在执行此方法时抛出异常“org.eclipse.swt.SWTException:Subclassing not allowed”。

在面向对象的设计原则中,组合优于继承。Eclipse鼓励遵循这一原则,所以不要轻易去继承SWT中的界面组件(如Shell类)来实现扩展,除非是那些最初设计目的就是说为了通过继承方式来扩展功能的类,例如对话框的Dialog类。一般来说,大部分SWT组件都不要继承它,而大部分JFace组件可以通过继承来扩展。

*********************************************************
 








本文转自redking51CTO博客,原文链接: http://blog.51cto.com/redking/64535 ,如需转载请自行联系原作者


相关文章
|
5月前
解决Feign远程调用参数里面内容丢失的问题
解决Feign远程调用参数里面内容丢失的问题
100 0
|
8月前
|
消息中间件 存储 NoSQL
深入理解Redis数据类型与基本操作
本篇深入剖析了Redis的多种数据类型与基本操作,为读者提供了对Redis丰富数据结构的深入理解和实际应用示例。我们首先介绍了字符串类型的设置与获取操作,以及字符串相关的命令,如获取字符串长度和追加字符串等。接着,深入探讨了列表类型的创建、操作和命令使用,演示了如何在列表中插入元素、获取范围内的元素以及弹出元素等。
221 0
|
27天前
|
C语言
【C语言】求一个整数的二进制序列中1的个数的三种方法
【C语言】求一个整数的二进制序列中1的个数的三种方法
14 0
|
机器学习/深度学习 人工智能 自然语言处理
NLP教程(8) - NLP中的卷积神经网络
本文介绍 NLP 中的卷积神经网络(CNN),讲解卷积神经网络的卷积层、池化层、多卷积核、多通道、卷积核、N-gram、filter、k-max pooling、文本分类等。
537 1
NLP教程(8) - NLP中的卷积神经网络
|
SQL 数据可视化 关系型数据库
7 款常用的 PostgreSQL GUI 工具测评
PostgreSQL 本身附带一个名为 psql 的内置 CLI,但有些人不喜欢通过命令行编写查询。本篇文章,码匠列举和介绍了可用于查询、可视化与分析 PostgreSQL 数据的 GUI 工具。
8412 0
7 款常用的 PostgreSQL GUI 工具测评
|
缓存 算法 存储
设计实现一个LRU Cache
1 什么是LRU Cache 在LeetCode上有一个LRU Cache实现的题目 Design and implement a data structure for Least Recently Used (LRU) cache.
3556 0
|
机器学习/深度学习 自然语言处理 Python
机器学习之条件随机场(CRF)
什么是CRF CRF即条件随机场(Conditional Random Fields),是在给定一组输入随机变量条件下另外一组输出随机变量的条件概率分布模型,它是一种判别式的概率无向图模型,既然是判别式,那就是对条件概率分布建模。
2708 0
|
8天前
|
人工智能 自然语言处理 API
深入浅出LangChain与智能Agent:构建下一代AI助手
LangChain为大型语言模型提供了一种全新的搭建和集成方式,通过这个强大的框架,我们可以将复杂的技术任务简化,让创意和创新更加易于实现。本文从LangChain是什么到LangChain的实际案例到智能体的快速发展做了全面的讲解。
279541 52
深入浅出LangChain与智能Agent:构建下一代AI助手
|
9天前
|
设计模式 人工智能 JSON
一文掌握大模型提示词技巧:从战略到战术
本文将用通俗易懂的语言,带你从战略(宏观)和战术(微观)两个层次掌握大模型提示词的常见技巧,真正做到理论和实践相结合,占领 AI 运用的先机。
237784 4
|
9天前
|
NoSQL Cloud Native Redis
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
阿里云瑶池数据库团队后续将持续参与Valkey社区,如过往在Redis社区一样耕耘,为开源社区作出持续贡献。
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新