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应用。







