精华内容
参与话题
问答
  • SWT基础学习

    千次阅读 2012-07-13 09:37:05
    开发步骤: 1.创建新工程,在src下新建lib文件夹,然后导入需要的jar包,配置 Java Build Path 将刚刚复制过来的jar包导入到工程, ...import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; i

    开发步骤:

    1.创建新工程,在src下新建lib文件夹,然后导入需要的jar包,配置 Java Build Path 将刚刚复制过来的jar包导入到工程,

                      

    2.新建一个java类,并创建main方法,方法内写入:

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Color;
    import org.eclipse.swt.graphics.Font;
    import org.eclipse.swt.graphics.Image;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Combo;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Table;
    import org.eclipse.swt.widgets.TableColumn;
    import org.eclipse.swt.widgets.TableItem;
    import org.eclipse.swt.widgets.Text;
    
    
    public class TestShell {
    	public static void main(String[] args) {
    		/**
    		 * 第一步创建Display,对应操作系统的控件,使用完必须释放
    		 */
    		Display display = new Display();
    		/**
    		 * 第二部创建shell
    		 * @style 
    		 */
    		Shell shell = new Shell(display);
    		shell.setText("第一个shell窗口");
    		/**
    		 * 第三部指定容器的布局类型
    		 */
    		GridLayout gl = new GridLayout(2,false);
    		gl.marginBottom = 20;
    		gl.marginTop = 10;
    		gl.marginLeft=30;
    		gl.marginRight = 30;
    		gl.verticalSpacing = 20;
    		gl.horizontalSpacing = 20;
    		shell.setLayout(gl);
    		/****
    		 * 第四步创建容器里的控件,并指定摆放位置
    		 */
    		Label label1 = new Label(shell,SWT.NONE);
    		label1.setText("姓名");
    		/**
    		 * 第一个参数是操作系统资源
    		 * 第二参数是字体样式
    		 * 第三参数是字的高度(字号大小)
    		 * 第4个参数是字显示样式
    		 */
    		Font labelFont = new Font(display,"微软雅黑",20,SWT.NONE);
    		
    		Text text1 = new Text(shell,SWT.BORDER);
    		text1.setFont(labelFont);
    		text1.setLayoutData(new GridData(SWT.FILL,SWT.TOP,true,false));
    		
    		Label label2 = new Label(shell,SWT.NONE);
    		label2.setText("密码");
    		
    		Color foreColor = new Color(display,255,0,0);
    		label2.setForeground(foreColor);
    		
    		Text text2 = new Text(shell,SWT.BORDER|SWT.PASSWORD);
    		text2.setLayoutData(new GridData(SWT.FILL,SWT.TOP,true,false));
    		Label label3 = new Label(shell,SWT.NONE);
    		label3.setText("下拉:");
    		Combo combo = new Combo(shell,SWT.NONE);
    		for(int i=1; i<=9; i++){
    			combo.add("下拉选项"+i);
    		}
    		combo.setLayoutData(new GridData(SWT.FILL,SWT.CENTER,true,false));
    		
    		/**
    		 * 创建表格4列的表格
    		 * 
    		 * 1.创建表头
    		 * 2.创建内容数据
    		 */
    		//表格样式是多选 垂直 水平滚动条,显示边缘
    		Table table = new Table(shell,SWT.MULTI|SWT.V_SCROLL|SWT.H_SCROLL|SWT.BORDER);
    		table.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,2,1));
    		table.setHeaderVisible(true);//设置表格头可见
    		table.setLinesVisible(true);//设置表格线可见
    		//创建表格头
    		for(int i=1; i<=4; i++){
    			TableColumn tableColumn = new TableColumn(table,SWT.NONE);
    			tableColumn.setText("第"+i+"列");
    			tableColumn.setWidth(200);
    		}
    		
    		//创建几个数据
    		TableItem item1 = new TableItem(table,SWT.NONE);
    		item1.setText(new String[]{"111","222","3333","444"});
    		
    		Button btn = new Button(shell,SWT.NONE);
    		btn.setText("提交");
    		btn.setLayoutData(new GridData(SWT.CENTER,SWT.CENTER,false,false,2,1));
    		
    		shell.open();
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
    		
    		
    		display.dispose();
    	
    	}
    }
    


    至此,一个简单的shell就创建成功了.运行结果如下:


    展开全文
  • swt做JAVA界面

    千次阅读 2018-06-18 12:20:39
    SWT概述 SWT是IBM公司开发的UI开发组件,它与AWT/SWING组件类似,但是SWT克服了AWT/SWING中许多问题,所以用SWT编写UI程序无论在美观成都还是响应速
    原文地址为:用swt做JAVA界面

    SWT概述

    SWTIBM公司开发的UI开发组件,它与AWT/SWING组件类似,但是SWT克服了AWT/SWING中许多问题,所以用SWT编写UI程序无论在美观成都还是响应速度上都远远超越了AWTSWING.这主要是因为AWT只是单纯模拟本地操作系统窗口组件,SWT最大化了操作系统的图形构件API,也就是说只要操作系统提供了图形构件,SWT就可以利用JNI调用他们,只有操作系统中不提供的组件SWT才会去模拟实现由于使用了JNI,使得它和本地操作系统紧密连接在一起,因此编写的界面和本地系统窗口几乎没有区别.JFaceSWT的一个增强库,它以来SWT并将其扩展,功能强大目前企业级的Java开发应用都会用到这个。

    调用关系:

    JFaceàSWTàJNIà--à本地操作系统窗口组件

    安装

    下载SWT安装的Jar包(注意操作系统),也可以在eclipseplugin目录中找到(SWT.jar),然后用WinRAR解压缩得到org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar以及5dll文件,如果已经配置好了JDK,那么将jar文件复制到JDK/jre/lib/ext/中,将dll文件复制到JDK/jre/bin/目录下,就完成了安装。

    http://zhidao.baidu.com/question/130025979.html?fr=ala0

    一、SWT程序起步

    第一个SWT程序:实现了一个记事本

    package swt;

    import org.eclipse.swt.widgets.*;

    import org.eclipse.swt.*;

    import org.eclipse.swt.events.*;

    import java.io.*;

    public class FirstSWT {

    private static String fn = "";

    private static Display display;

    private static Shell shell;

    private static Text text;

    private Button newButton;

    private Button openButton;

    private Button saveButton;

    private Button delButton;

    private Button quitButton;

    public FirstSWT(){

    display = new Display();

    //基本对话框

    shell = new Shell(display,SWT.DIALOG_TRIM);

    shell.setText("Note pad");

    shell.setSize(600,400);

    newButton = new Button(shell,SWT.PUSH);

    newButton.setLocation(2,5);

    newButton.setSize(50,20);

    newButton.setText("new");

    openButton = new Button(shell,SWT.PUSH);

    openButton.setLocation(60,5);

    openButton.setSize(50,20);

    openButton.setText("open");

    saveButton = new Button(shell,SWT.PUSH);

    saveButton.setLocation(118,5);

    saveButton.setSize(50,20);

    saveButton.setText("save");

    delButton = new Button(shell,SWT.PUSH);

    delButton.setLocation(180,5);

    delButton.setSize(50,20);

    delButton.setText("delete");

    quitButton = new Button(shell,SWT.PUSH);

    quitButton.setLocation(540,5);

    quitButton.setSize(50,20);

    quitButton.setText("quit");

    text = new Text(shell,SWT.MULTI|SWT.BORDER|SWT.V_SCROLL|SWT.WRAP);

    text.setLocation(2,30);

    text.setSize(shell.getClientArea().width-4,shell.getClientArea().height-35);

    newButton.addSelectionListener(new SelectionAdapter(){

    public void widgetSelected(SelectionEvent event)

    {

    fn = "";

    shell.setText("第一个SWT程序");

    text.setText("");

    }

    });

    openButton.addSelectionListener(new SelectionAdapter()

    {

    public void widgetSelected(SelectionEvent event)

    {

    FileDialog dlg = new FileDialog(shell,SWT.OPEN);

    String fileName = dlg.open();

    try{

    if(fileName != null)

    {

    //打开指定文件

    FileInputStream fis = new FileInputStream(fileName);

    text.setText("");

    BufferedReader in = new BufferedReader(new InputStreamReader(fis));

    String s = null;

    //将指定文件一行一行的加入记事本

    while((s=in.readLine())!=null)

    text.append(s+"/r/n");

    fn = fileName;

    shell.setText(fn);

    MessageBox successBox = new MessageBox(shell);

    successBox.setMessage("打开文件成功");

    successBox.setText("信息");

    successBox.open();

    in.close();

    }

    }catch(NullPointerException en)

    {

    System.out.println("warning No file selected!");

    }catch(Exception e)

    {

    MessageBox errorBox = new MessageBox(shell,SWT.ICON_ERROR);

    errorBox.setText("错误");

    errorBox.setMessage("打开文件失败!");

    errorBox.open();

    }

    }

    }

    );

    saveButton.addSelectionListener(new SelectionAdapter()

    {

    public void widgetSelected(SelectionEvent event)

    {

    try{

    String fileName = null;

    if(fn.equals(""))

    {

    FileDialog dlg = new FileDialog(shell,SWT.SAVE);

    fileName = dlg.open();

    FileOutputStream fos = new FileOutputStream(fileName);

    OutputStreamWriter out = new OutputStreamWriter(fos);

    out.write(text.getText());

    out.close();

    alertMsg(shell,"创建文件成功");

    if(fileName != null)

    {

    fn = fileName;

    shell.setText(fn);

    }

    }else

    {

    FileOutputStream fos = new FileOutputStream(fn);

    OutputStreamWriter out = new OutputStreamWriter(fos);

    out.write(text.getText());

    out.close();

    }

    }catch(NullPointerException en)

    {

    System.out.println("warning No file selected!");

    }

    catch(Exception e)

    {

    e.printStackTrace();

    MessageBox errorBox = new MessageBox(shell,SWT.ICON_ERROR);

    errorBox.setText("错误");

    errorBox.setMessage("保存文件失败!");

    errorBox.open();

    }

    }

    });

    quitButton.addSelectionListener(new SelectionAdapter()

    {

    public void widgetSelected(SelectionEvent e)

    {

    System.out.println(e.toString());

    display.dispose();

    }

    });

    shell.open();

    while(!shell.isDisposed())

    {

    if(!display.readAndDispatch())

    {

    // System.out.println(display.msg.toString());

    display.sleep();

    }

    }

    System.out.println("closed");

    display.dispose();

    }

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    new FirstSWT();

    }

    public static void alertMsg(Shell shell,String msg)

    {

    MessageBox alertBox = new MessageBox(shell);

    alertBox.setMessage(msg);

    alertBox.setText("信息");

    alertBox.open();

    }

    }

    SWT程序流程

    1. 创建一个Display对象

    2. 创建一个或者多个Shell对象,你可以认为Shell代表了程序的窗口。

    3. Shell内创建各种部件(widget

    4. 对各个部件进行初始化(外观,状态等),同时为各种部件的事件创建监听器(listener

    5. 调用Shell对象的open()方法以显示窗体

    6. 各种事件进行监听并处理,直到程序发出退出消息

    7. 调用Display对象的dispose()方法以结束程序。

    可见和Swing&AWT差不多,都是一个主容器以及一系列内部容器嵌套而成。只是这里我们在组建或是容器的构造函数中就指定了其所述的父组件,不用再add了。在一个就是SWT的布局管理和Swing有所不同。

    二、SWT的布局管理

    主要分为:FillLayoutGridLayoutRowLayoutFormLayoutStackLayout,顾名思义吧。目前绝大多数(90%)都是GridLayout,资料甚多,不介绍了,介绍下自己感觉比较灵活的另一种FormLayout

    FormLayout formLayout = new FormLayout();

    formLayout.marginHeight = 5; 

    formLayout.marginWidth = 5;

    formLayout.spacing = 5;

    //设置了边界高度和宽度以及组件间距的FormLayout

    这个在原有UI组件中没有,它是一个非常灵活可控的布局方式,每一个组件在添加时候,需要设置一个构造并设置一个FormData对象,布局管理器通过对它的设置来完成布局。FromData拥有四个域topbottomleftright分别对应此组件的上下左右。每一个域都要构造一个FormAttachment对象来进行设置,FormAttachment构造器如下:

    来看如下代码:

    formData = new FormData();

    formData.top = new FormAttachment(0,0);

    formData.left = new FormAttachment(tabFolder,0,SWT.RIGHT);

    formData.right = new FormAttachment(100,0);

    formData.bottom = new FormAttachment(97,0);

    channelTree.setLayoutData(formData);

    这里这个Tree组件的top被设置在距离顶端0%,偏移为0个像素点的位置,当然,因为前面我们设置了组件的边界高度、宽度以及间距,所以它并不会顶格;组件的left被设置在距离tabFolder组件右边0个像素点的位置,同理因为有marginspace,两组件有至少10的距离;后面两个比较好理解,即右边界设置为整个父组件的最右边(从左往右100%)的位置,偏移为0,下边界为97%的位置。

    三、SWT中的ActiveX/Com接口

    SWT中,我们可以通过java代码(OLE操作)调用ActiveX组件,例如WordExcelWMP等,而且它们都是可控的。下面介绍下具体的引用和控制方法。

    基本方法:

    1. 使用SWT进行OLE操作时,所有的对OLE对象的引用都是通过OlE定义的Id获得,获得各个对象的Id方法稍后会进行说明。

    2. 所有的动作都通过OleAutomation对象进行,OleAutomation可以代表任一OLE对象,如WorkbookWorksheetRange。可以通过getProperty()方法获得它的属性,也可以用setProperty()方法为它的属性赋值

    3. Variant对象一般是封装了OLE对象的值,可以通过它进行值传入及获得相应的值,也可以通过它获得OleAutomation对象。

    以控制Excel表格为例介绍SWTOLE操作:

    1. 打开OLE/COM Object Viewer(VS2008自带),找到DocumentObjects,找到Microsoft Excel工作表。找到VersionIndependentProgID,也就是对应的程序中需要调用的ID值。这里是Excel.Sheet,然后写下如下代码,创建workbook

    OleClientSite clientSite = new OleClientSite(oleFrame,SWT.NONE,"Excel.Sheet");

            //获得Excelworkbook对象

    OleAutomation workbook = new OleAutomation(clientSite);  

    2. 点击右键选择view type informat,找到dispinterface _Workbooks (注意:有下划线。如果使用了分类功能,在Dispinterfaces节点下),然后点击method,即查找它所包含的方法,选择sheet,找到对应方法的ID 0x000001e5

    3. OleAutomation sheet = workbook.getProperty(SHEET_ID,new Variant[]{new Variant(1)}).getAutomation();获得sheet对象。这里SHEET_ID就是0x000001e5

    4. 获得worksheet对象之后,再查找worksheet的方法(dispinterface _Worksheet),找到Range,得知:这个方法是获得一组Range对象,是一个是一个proget类型的方法(get类型),方法描述是Range* Range([in] VARIANT Cell1, [in, optional] VARIANT Cell2),这里的“in”表示传入的参数,“optional”表示这个参数是可选的,即可要可不要。传入的参数以单元格的location表示(如:A1D2E5),一个参数表示一个单元格,两个参数表示两个参数代表的单元格区域(如:A1 * D5),那么我们可以根据这个方法写如下代码:        

    5. Variant cellA1Variant = sheet.getProperty(CELL_IDnew Variant[]{new Variant("A1")});

    OleAutomation cellA1 = cellA1Variant.getAutomation();

    获得A1单元格,CELL_ID即刚才Range方法的ID 0x000000c5

    6. 获得cellA1这个Range对象之后,查找其中的Value方法,可以对其赋值:

    //A1单元格赋值

    cellA1.setProperty(CELL_VALUE_IDnew Variant("Hello OLE!"));

    其中CELL_VALUE_IDValue方法的ID,这样就Hello OLE写到了A1单元格中了。

    7. 在组件中不仅有propset类型的方法,也会有对应的propget的方法,用于获得相应的值,返回值仍然用Variant带回。

    Variant getValue = cellA1.getProperty(CELL_VALUE_ID);

    System.out.println(getValue.toString());

    四、结束

    由于时间关系只能讲一些SWT的基本应用,更加全面的学习的话大家可以去参阅《Eclipse从入门到精通》,里面不仅介绍了SWT,对JFace也有一定的讲解,内容涵盖较广。

     

     

     

    以上是俱乐部一位前辈所写,本人只是把这贴出来而已


    转载请注明本文地址:用swt做JAVA界面
    展开全文
  • SWT开发Java应用程序GUI入门

    万次阅读 2016-07-10 11:29:41
    第一次做了Java GUI,我选择用elipse自己的前段开发工具 SWT/JFace。这篇文章是基于eclipse MARS.2. 用SWT编写的GUI的风格如下: 1、 SWT中的一些概念1.1 Display & Shell Display 和 She

    第一次做了Java GUI,我选择用elipse自己的前段开发工具 SWT/JFace。这篇文章是基于eclipse MARS.2.  用SWT编写的GUI的风格如下:


                                                                           


    1、 SWT中的一些概念

    1.1 Display & Shell

    Display 和 Shell 类是SWT中重要的组件。 org.eclipse.swt.widgets.Shell 这个类代表窗口。org.eclipse.swt.widgets.Display主要负责时间循环、字体、颜色、UI线程和其他线程之间的通信(这个功能非常重要,在后面的例子中会说到,UI 线程和非UI线程之间通信,如果不获取Display的话,会报”无法访问线程“的错误)。Display 是左右SWT组件的基础。

    每个SWT应用要求至少有一个Display 和一个或多个shell对象。主窗口shell的构造函数把Display作为默认参数。例如:


    Display display = new Display();
    Shell shell = new Shell(display);
    shell.open();
     
    // run the event loop as long as the window is open
    while (!shell.isDisposed()) {
       // read the next OS event queue and transfer it to a SWT event
     if (!display.readAndDispatch())
      {
     // if there are currently no other OS event to process
     // sleep until the next OS event is available
       display.sleep();
      }
    }
     
    // disposes all associated windows and their components
    display.dispose();

    1.2 SWT 窗口中的部件

    SWT编写程序的窗口部件都在包org.eclipse.swt.widgets 和 org.eclipse.swt.custom中, 下图是是一些部件的图样:




    2  在eclipse中编写一个简单的SWT的例子

    2.1 创建一个RCP Plugin Progect

    在eclipse中选择File/New/Other...




    • 不需要创建Workbenck应用,所以选择下图的 1 所示的选项
    • 在下图 2 的地方选择”yes“,否则创建一个web应用



    创建一个工程:



    添加依赖的库文件





    2.2 编写例子

    这是一个简单的例子,没用用WindowBuilder工具(可以用拖拽的方式制作界面的布局)

    • HelloSWT.java

    package org.o7planning.tutorial.swt.helloswt;
     
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
     
    public class HelloSWT {
     
       public static void main(String[] args) {
           // Create Display
           Display display = new Display();
           // Create Shell (Window) from diplay
           Shell shell = new Shell(display);
     
           shell.open();
     
           while (!shell.isDisposed()) {
               if (!display.readAndDispatch())
                   display.sleep();
           }
           display.dispose();
       }
    }

    右键点击HelloSWT类,选择Run As/Java Application.


    结果如下: 一个空的窗口




    下面一篇文章是用Window Buider 构建一个SWT的桌面应用。

    展开全文
  • java SWT官网例子

    热门讨论 2012-04-16 09:22:46
    java的一套GUI库,eclipse就是用...这套例子是swt官网上的小型例子,每个文件介绍一个简单的功能。 官方网址 http://www.eclipse.org/swt/snippets/ 需要的界面效果可以再官方网址上找到说明,再查看对应的java文件即可
  • 看了一下对Java GUI讨论的帖子,所以写了一篇文章来阐述一下各种GUI技术的优劣。 Java世界中,目前最知名的三大GUI库分别是: ...3、来自IBM Eclipse开源项目的SWT(Standard Widget Toolkit)标...

    看了一下对Java GUI讨论的帖子,所以写了一篇文章来阐述一下各种GUI技术的优劣。
    Java世界中,目前最知名的三大GUI库分别是:
    1、AWT(Abstract Window Toolkit)抽象窗口工具包库,包含于所有的Java SDK中
    2、Swing高级图形库,包含于Java2 SDK中
    3、来自IBM Eclipse开源项目的SWT(Standard Widget Toolkit)标准窗口部件库,不包含于JDK中,需要从Eclipse单独下载

    一、AWT的原理:小巧却简陋的GUI系统
    AWT出现于Java 1.x中,是Java初期所内置的一种面向窗口应用的库。AWT使用的技术是对等设计模式(即Peer),其结构关系参见下图。


    从这幅类关系图很容易看出AWT的技术实现和Peer设计模式。图中,黄色的类是java.awt包中的类,浅灰色部分是Java虚拟机部分,而深灰色则是Windows平台。
    awt的重点是对等Peer设计模式。所谓Peer对等设计模式就是将awt控件直接对应到运行平台上的一个类似或者等同控件上。比如图中的Button类就是对应了深灰色的Windows的标准Button功能。
    对等模式用于在两个控件间之间建立一个相互作用的联系,而充当纽带的则是Java虚拟机和虚拟机-GDI的接口(以Windows为例子)。所以,我们可以看出,awt首先需要经过通用的Java技术来控制图形、事件等,然后Java虚拟机再将请求传送到具体的平台图形和控件接口去交互。
    对等模式的效率并不很高,因为AWT通过了虚拟机和虚拟机-GDI这两个层次来完成一个操作,经过的层次系统越多,速度和效率就越慢。而且Peer对等模式有一个致命的弱点:移植性非常差!
    这就是Sun为什么要用Swing来诱惑我们离开AWT的主要原因。因为既然是对等模式,那么AWT就必须使用所有图形操作系统的图形接口功能的交集,因为 AWT的接口只有一套,所以,为了保证移植性,就只能使用所有系统都能够支持的最少特性。因而我们经常可以听见有人抱怨AWT的功能太少,图形太难看等等,这是为了保证移植性而作出的牺牲。

    二、猛犸巨兽的诞生-Swing

    从Java2 即Java 1.2版本开始,Sun开始在JDK中提供一套新的图形界面接口系统-Swing。所有Java爱好者都投入了对Swing的研究和迷恋。随着一大批使用Swing作为界面技术的IDE和程序出现,很快大家都意识到Swing的问题所在。
    一些人认为Swing是轻量级的GUI系统,无论官方如何说,没有一个Java程序员会认为Swing是轻量级的,相反,Swing是一个非常巨大的GUI库,这一点已经是Java界的共识。
    Swing的一些底层类是借用了AWT的Component、Container、Window等少数几个基础类。估计的原因是为了保持与AWT的兼容,方便大家将代码移植到Swing上。
    下面是Swing的类关系图:


    菊黄色类为Swing包的类。对比一下Swing的图与AWT的图,我们可以发现,Swing图中,awt体系中的深灰色Windows控件类已经被去掉了。因为Swing不再沿用Peer对等模式来实现GUI界面。
    这是Swing的核心思想之一,Swing是完全基于Java自绘制图形而实现的,因而Swing的界面看起来与Windows不再有任何类似,尤其是窗口控件的样式(虽然我们也可以通过换肤来达到模拟Windows界面的效果)。
    所以上图清楚的表明了Swing是一个高层的GUI系统,而不像AWT那样与运行平台技术更加靠近的系统。我们仍然用Button与Panel来做了一个例子,图中关系看出,Swing的类继承关系比AWT要复杂的多,而且Swing类大多都经过了中间的转接类-JComponent。而我们常用的JFrame则另辟蹊径,从awt的window继承了下来。
    这种结构关系决定了Swing的庞大与复杂性。很多初学者都难以理解Swing的模式和结构。
    Swing 中的控件都是利用Java图形功能绘制出来的,而不是对应到平台的一个具体控件实现。我们所用的所有Swing控件都是直接或者间接用Graphics绘制出来的,这种实现方式最大的好处是很灵活,我们想要什么样的控件,就直接用Graphics绘制出来就是了。
    Sun之所以用这种方式来实现,是为了在不牺牲移植性的基础上加入丰富的界面交互功能。

    但是缺点也很明显:Swing的速度和效率是所有GUI系统中最慢的。

    JBuilder和NetBeans的IDE都是纯正的Swing界面,启动一下,然后操作一下,比如拖动窗口之类的试试,你就会明白我在说什么。
    之所以导致这个结果,其原因是:
    1、Swing的类层次太深,一个JFrame经过了4层的类继承关系,如果再加上虚拟机的图形功能内部实现,就有6层的转接关系,每一次的继承和转接都会消耗系统资源和速度损失。(过多的继承会降低系统的速度,因为操作子类往往是使用基类指向来完成通用操作的)
    2、Swing是基于自绘制图形技术的,而Java为了保持可移植性,所以无法使用硬件加速和平台特性来加快图形操作的速度。因而Java的图形技术都是“高层”的图形技术,就好像我们用Windows GDI去做动画一样,当然速度会很慢。
    三、新的曙光-SWT


    应该说,稍有阅历的Java的程序员都知道很多人对Swing效率低下的抱怨。IBM赞助的Eclipse开放源码项目,搞了一个另类的GUI系统-SWT。
    SWT是一个非常独特的技术,其核心思想和Windows上的DirectX如出一辙,也许SWT的程序员真的是借鉴了DirectX成功的秘诀。
    下面是SWT技术原理的类关系图:

     

    我们会看见,SWT的类关系非常直接而且易懂,有点像Delphi的API接口思想(此是我随便乱弹,与Delphi没有什么关系)。最重要的一点就是SWT的核心思想:SWT的功能实现是完全构筑在以JNI为基础的,对运行平台的直接调用封装上的。
    我们可以从图中看见,SWT的功能没有通过任何Java虚拟机来操作,而是直接调用Windows GDI和Shell功能,这一点是通过JNI方法调用完成。
    一定会有人说SWT破坏了java的移植思想,不过Eclipse的大范围流行,正好证明了SWT非但没有阻碍移植性,反而提高了各种操作系统对于Java GUI的利用和期待。这不能不说Eclipse项目组是充满智慧的。
    在Eclipse下,plugin目录的swt目录下,你可以发现一个dll动态库文件,这个dll就是JNI方法调用库。
    基于SWT技术实现的Eclipse界面不但速度很快,效率很高,而且比Swing要美观的多。这就是直接调用封装的效果。
    我们看看SWT的源代码就能更加明白为什么SWT那么流行,为什么SWT的速度像飞一样快,下面是从button类中抽取的一小段代码:

     

    代码:

    int callWindowProc (int msg, int wParam, int lParam) { 

     if (handle == 0) return 0;

     return OS.CallWindowProc (ButtonProc, handle, msg, wParam, lParam);

    }



    int windowProc () { 

     return ButtonProc;

    }



    LRESULT wmDrawChild (int wParam, int lParam) { 

     if ((style & SWT.ARROW) == 0) return super.wmDrawChild (wParam, lParam);

     DRAWITEMSTRUCT struct = new DRAWITEMSTRUCT ();

     OS.MoveMemory (struct, lParam, DRAWITEMSTRUCT.sizeof);

     int uState = OS.DFCS_SCROLLLEFT;

     switch (style & (SWT.UP | SWT.DOWN | SWT.LEFT | SWT.RIGHT)) { 

       case SWT.UP: uState = OS.DFCS_SCROLLUP; break;

       case SWT.DOWN: uState = OS.DFCS_SCROLLDOWN; break;

       case SWT.LEFT: uState = OS.DFCS_SCROLLLEFT; break;

       case SWT.RIGHT: uState = OS.DFCS_SCROLLRIGHT; break;

     }

     if (!getEnabled ()) uState |= OS.DFCS_INACTIVE;

     if ((style & SWT.FLAT) == SWT.FLAT) uState |= OS.DFCS_FLAT;

     if ((struct.itemState & OS.ODS_SELECTED) != 0) uState |= OS.DFCS_PUSHED;

     RECT rect = new RECT ();

     OS.SetRect (rect, struct.left, struct.top, struct.right, struct.bottom);

     OS.DrawFrameControl (struct.hDC, rect, OS.DFC_SCROLL, uState);

     return null;

    }

     


    我想任何一个有点Windows编程知识的人都会惊讶SWT的方式和做法,LRESULT、WindowProc都是做什么的,我想不用我多说了。我第一次看见SWT的代码时,惊讶的张大了嘴,我实在无法想象SWT项目组敢于将Java技术与Windows平台结合到如此紧密(当然,Linux平台版本也同样的结合紧密)。我居然在SWT里发现了一个叫Tray的类,猜猜看它是干什么的?Tray可以让你在java程序中显示一个任务栏图标,极度晕眩!
    我想,不用再继续介绍SWT了,你一定也很兴奋,从SWT开始,JavaGUI并不一定意味着缓慢、低效率、弱小的功能,Windows程序的眩目与速度,Java程序也可以拥有,这就是SWT的价值。
    更加重要的是,SWT打破了长久以来人们对于移植性的误区,似乎移植性就只能使用少到可怜的功能,我们也可以用JNI来拥抱Java的世界,我想,将来不仅仅是界面会借助JNI的方式,也许我们的很多Java思想都会悄悄的发生改变,也许有一天我们的Java代码可以运行的像VB一样快,这种思想意识的变革就是SWT的价值。

    至于Swing的结局,我不知道,但是我知道我更加喜欢轻量级的而且快速的SWT,给你的程序多一个选择吧。

    展开全文
  • 什么是SWT

    千次阅读 2016-01-07 14:18:17
    什么是SWT 参考:http://www.cppblog.com/baby-fly/archive/2009/10/20/99008.html  用java的人一定都知道AWT和Swing,而SWT(Standard Widget Toolkit)则是由Eclipse项目组织开发的一套完整的图形界面开发包...
  • SWT

    2018-07-25 16:02:28
    SWT是一个GUI的开发工具包,SWT将GUI的基本组成成分分为了显示界面(Display)命令界面(Shell)和窗口部件(widgets). swt.widgets包下面有Button,Text,Label等最常用的组件。其中自重要的组件是shell和Composite....
  • 从Java诞生至今,已经在太多的领域取得成功,然而它却很少在图形界面程序上崭露头角。究其原因,Java语言缺省的...如今,Eclipse组织编写的SWT开发包,为Java程序员提供了AWT和SWING之外的一个更佳的选择。在本文中...
  • SWT问题分析总结

    千次阅读 2019-03-06 17:23:35
    文章目录1 概述2 SWT机制2.1 原理设计框图2.2 Watchdog的初始化2.3 Watchdog的运作3 导致 SWT 重启原因4 log分析4.1 搜索关键 watchdog4.2 搜索关键字 held by4.3 检查Binder的Server 端4.3.1 重要信息4.3.2 如何...
  • 初次接触SWT工程,打算用这个编写一个记事本。跟着我一步步从无到有建立SWT工程吧!
  • 生物统计学

    2013-06-13 10:41:33
    生物统计学的经典教材 生物统计学—杜荣骞 系统讲解生物统计学的各个方面,很有用!
  • 生物统计学-李春喜版

    2016-03-14 19:04:15
    全书重点介绍生命科学研究中应用统计学原理进行研究设计、搜集数据、分析与解释研究结果的基本逻辑思维方式与方法。本书可作为医学院校各专业以及其他学科如农学、林业学、管理学与心理学本科生的基础统计学教材,也...
  • 生物统计学基础 (原书第五版) [美]伯纳德 罗斯纳 著 孙尚拱 译 2004年第1版
  • 生物统计学(杜荣骞),一本关于生物统计的教材
  • 生物统计学算法-生物统计学.pdf 生物统计学 理论部分,算法靠它了~!
  • 生物统计学 电子书

    2009-04-21 23:01:29
    生物统计学电子书~~~~~~~~~~~~~~~~~~~~~~~~~
  • 生物统计学基础+作者(美)伯纳德+罗斯纳_中文版
  • 第五版的完整光盘资料,书很容易下载到,光盘的数据很辛苦才找到
  • 生物统计学基础(Fundamentals of Biostatistics,伯纳德-罗斯纳著,孙尚拱译)给出统计推断的基本方法,如下:
  • swt

    2010-07-06 00:02:00
    swt目录[隐藏]简介 相关技术信息 一、SWT应用程序的组成 二、使用SWT程序Dota常用语简介 相关技术信息 一、SWT应用程序的组成 二、使用SWT程序Dota常用语 Mac上的SWT [编辑本段]简介 SWT(Standard Widget Tool
  • Population Mean: if a population contains N entities whose measures are x1, x2, … xN, the arithmetic mean is given by Sample Mean: if a sample collected from apopulation contains n observations
  • SWT 全接触

    2014-06-09 20:27:15
    转自:http://www.ibm.com/developerworks/cn/opensource/os-swt/index.html
  • SWT WIN32 Extension

    2013-11-06 12:18:40
    使用SWT Win32 Extension,您将不需要创建原生的动态链接库来调用操作系统动态链接库的系统API或者方法。您仅仅需要做的就是编写Java代码,SWT Win32 Extension来负责剩下的部分。SWT Win32 Extension提供了一系列的...
  • 理解SWT布局

    千次阅读 2006-09-28 00:38:00
    FormLayout * 2.0新特性* FormLayout通过为小窗口部件创建四边的Form附加值(attachment)来进行工作,并且把这些Form附加值存储在布局数据中。一个 附加值让一个小窗口部件指定的一边粘贴(attach)到父Composite...
  • SWT创建菜单

    2010-01-26 20:53:11
    使用SWT创建一个菜单条,模拟实现了多级菜单,分隔符,快捷键,响应事件等功能. 代码如下: Java代码 import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org....
  • SWT本身仅仅是Eclipse组织为了开发 Eclipse IDE环境所编写的一组底层图形界面 API。或许是无心插柳,或是有意为之,至今为止,SWT无论是在性能和外观上,都超越了SUN公司提供的AWT和SWING。目前Eclipse IDE已经开发...
  • SWT Table示例

    万次阅读 2012-10-26 23:11:10
    /* * 文件名:TableSample.java ... All Rights Reserved. * 描述: TableSample.java * 修改人:Andy * 修改时间:2012-10-26 * 修改内容:新增 */ package org.wang.andy.swtjface.demo.table;...
  • Eclipse中如何使用SWT

    万次阅读 2012-03-05 10:45:44
    SWT(Standard Widget Toolkit)   Standard Widget Toolkit是一个开源的GUI编程框架,与AWT/Swing有相似的用处,著名的开源IDE-eclipse就是用SWT开发的.   在SWT之前,Sun已经提供了一个跨平台GUI开发工具包AWT...
  • 《Eclipse SWT/JFACE 核心应用》 清华大学出版社 6 面板容器类 所有容器类的父类:Composite类。 容器类:分组框(Group)、选项卡(TabFolder)、自定义选项卡(CTabFolder)、分割窗框(SashForm)、自定义...
  • swt_win32_extension

    2016-07-02 17:23:26
    基本上关于swt_win32_extension该有的都有了,其中org.eclipse.swt.win32.jar并不是必须的,如果出现OS.class未找到异常等,就在构建路径里加上org.sf.feeling.swt.win32.extension_1.1.0.jar这个包就可以了。...

空空如也

1 2 3 4 5 ... 20
收藏数 37,976
精华内容 15,190
关键字:

swt