首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

3.2  SWT疑难点

SWT的API数量是非常多的,不过对于熟悉Swing或者其他语言的界面开发者来说,只要借助帮助文档一般都可以很快掌握其使用。所以就不打算把所有部件的使用方式再重复一遍了,这里只介绍一些需要重点注意的控件方法。

3.2.1  Button部件

在GUI术语中,这两个部件分别被叫做复选框和单选按钮,也就是它们也是按钮的一种,但是无论是Delphi中的VCL、.NET Framework还是Swing,都把它们看作是与Button不同的部件。当程序员开始学习SWT的时候,突然发现SWT中没有Checkbox、RadioButton控件了,难道SWT不支持吗?

当然是不是了,SWT中把看成了按钮部件的不同样式,不再用不同的类区分它们。当新建一个Button实例的时候,只要指定风格为SWT.CHECK或者SWT. RADIO就可以了。

3.2.2  Text部件

与Swing中不同,SWT中的单行文本框和多行文本框都是用Text部件表示,只是通过SWT.SINGLE、SWT.MULTI两种不同的风格来区分。Text本身支持滚动条(SWT.H_SCROLL和SWT.V_SCROLL风格),无需像Swing中那样要把文本框包在ScrollPane中才可以。

3.2.3  Tray

Tray是SWT提供的一个系统托盘类,通过这个类可以在系统托盘中增加图标。这看起来很酷,不过要尽力避免使用它,因为目前此部件还不能做到完全地跨平台。

3.2.4  Table

表格控件是一个非常常用的控件,可以用来实现大数据量的展示和编辑,SWT中的Table控件就是提供这样功能的一个控件,与Swing的JTable比起来Table的可用性更好。下面就来看一下对Table的主要操作方式。

(1)   给Table增加列:

TableColumn colName = new TableColumn(table,SWT.LEFT);

colName.setText("名称");

colName.setWidth(100);

(2)   给Table增加行:

TableItem item = new TableItem(table, SWT.NONE);

(3)   为单元格增加编辑器:

TableEditor editor = new TableEditor(table);

Text text = new Text(table, SWT.NONE);

editor.grabHorizontal = true;

editor.setEditor(text, item, 5);

editor = new TableEditor(table);

Table的单元格默认是没有任何编辑器的,当然单元格也就是只读的了,如果我们要编辑单元格的话就必须为单元格设定编辑器,编辑器可以是文本框、复选框、单选按钮等。

下面这段代码就是为item这一行的第5列增加一个文本编辑器,同理也可以为其增加复选框编辑器:

editor = new TableEditor(table);

Button button = new Button(table, SWT.CHECK);

button.pack();

editor.minimumWidth = button.getSize().x;

editor.horizontalAlignment = SWT.CENTER;

editor.setEditor(button, item, 5);

3.2.5  在SWT中显示AWT/Swing对象

SWT在设计之初是想兼容AWT/Swing的,但是由于SUN的极度不配合,导致SWT最终没有能兼容AWT。这就造成AWT/Swing中原有的一些很好用的代码无法移植到SWT中的问题。比如做图形化报表通常使用JFreeChart,但是JFreeChart只能显示在AWT/Swing中,没有提供SWT的支持,是否代表我们在SWT中就不能使用它了呢?当然不是了。我们可以用SWT_AWT桥接器来解决这个问题。

调用SWT_AWT的getFrame方法就可以把一个Composite面板转换成AWT中的Frame,这样就可以在这个Frame中进行任何AWT/Swing相关的操作了。

比如使用JFreeChart:

Composite drawarea = new Composite(parent, SWT.EMBEDDED);

drawarea.setLayout(new FillLayout());

Frame canvasFrame = SWT_AWT.new_Frame(drawarea);

canvas = new java.awt.Canvas() {

public void paint(Graphics g) {

        super.paint(g);

        if (chart != null)

            chart.draw((Graphics2D)g, getBounds());

    }

};

canvasFrame.add(canvas);

如果在Frame中使用了AWT/Swing部件,我们也完全可以在SWT代码中访问AWT/Swing部件,由于这些AWT/Swing部件不是在一个UI线程中的,所以在访问的时候要进行同步。

Display.getDefault().asyncExec(new Runnable){
        public void run() {
            awtButton.setText("I am AWT Button");    
        }               
    };

还有一些Java的图形化应用也可以通过这种方式来支持SWT,比如一些成熟的Java GIS应用。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论