经常有人抱怨java的awt,swing窗口太难看,和系统的很不协调,那么就用SWT吧,这个是eclipse基金会为了将eclipse实现的更人性化而开发的一组基于操作系统原生窗口的API。和wx,gtk,qt等图形用户界面库开发比较类似,开发流程等都可以举一反三。
下面一个Helloworld的例子:
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionAdapter;
import javax.swing.JOptionPane;
public class hello {
public static void main(String []s){
//Display是与系统线程打交道用的,与操作系统图形库交互
Display dis=new Display();
//GridLayout 有两个构造函数,一个是空的,还一个是
//GridLayout(int colsNum,boolean makeColumnsEqualWidth)
//用过swing的人都知道GridLayout是按列算的,行只是随之变化
//的,所以第一个参数指明有几列。第二个参数指明是否没列都等宽
GridLayout gl=new GridLayout(3,false);
//shell表示一个窗口基础模板,相当于swing中的Container,
//窗口指定上级模板是Display就表示要作为顶级窗口来显示.
Shell shell=new Shell(dis);
shell.setText("Helloworld Example!");
shell.setSize(200, 300);
//给shell加上布局管理器
shell.setLayout(gl);
for(int i=0;i<5;i++){
//作为基于操作系统原生界面的GUI库类(如wx,gtk,qt等)而言,一般都是在定义
//一个对象(组件,控制器等等)的时候,直接指定他所要放上去
//的父模板,下面的代码表示这个Button对象放到窗口对象shell
//上,另外,和swing另一个不同点是他在定义的时候指定类型,而不是像swing中
//再定义一个新的类别,比如下面的SWT.RADIO在swing中对应JRadioButton。
Button button=new Button(shell,SWT.RADIO);
button.setText("button"+i);
button.setSize(new Point(20,20));
button.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
//内部类来处理事件,很常见的一种手法。另外还可以在外部写一个类继承
//一个Adapter类或者实现Listener接口两种方式,我故意用swing的
//JOptionPane对比一下,基于操作系统的原生窗口和JVM生成窗口对比
JOptionPane.showMessageDialog(null,((Button)e.getSource()).getText());
}
});
}
//从下面开始又是和swing完全不同的了,shell.open()将shell打开监听所有事件。
//一直等到用户关闭程序再dis.dispose()回收垃圾。
shell.open();
while (!shell.isDisposed()) {
if (!dis.readAndDispatch())
dis.sleep();
}
dis.dispose();
}
}
结果如下:
很显然,原生窗口看的更自然一些,当然,swing更亮些