Java 实在是一门很不错的语言,毫不例外的,Java也有这样那样的弱点。比如和C 语言比较性能上的差距,在 Java 解释器实现了JIT 功能后,差别不是那么大了,考虑今天的硬件速度,对大部分用户来说可以忽略不计。另一个弱点是 在需要和操作系统交互时,Java 总是显得那么力不从心。现在总算有了SWT ,希望开源的Java 有一天能够把SWT集成起来。
这里介绍一个简单例子,是Swing没法做到的。截获用户注销(Log off )事件以及终止它。
public class LogoffListener {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
display.addListener(SWT.Close, new Listener() {
public void handleEvent(Event event) {
MessageBox mb = new MessageBox(shell,
SWT.APPLICATION_MODAL | SWT.OK | SWT.CANCEL);
mb.setText( " 询问 " );
mb.setMessage( " 退出系统? " );
event.doit = mb.open() == SWT.OK;
}
});
shell.open();
while ( ! shell.isDisposed()) {
if ( ! display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
当系统注销是, display 会得到一个SWT.Close 的事件。如果在事件处理函数中设置doit 为false ,将提示系统取消注销。在某些不支持这项操作的操作系统上,当然程序还是会被关掉,然后系统注销。Windows XP是支持的。
这里就有个问题了。在Java 这样一门以Write Once, Run Anywhere为座右铭的语言中,这样的功能是不是有意义呢? 这一点能够引起大量的讨论。在这里我想简单说一点,能不能做,和应不应该做是两回事。一门通用的语言肯定会有需要这样的功能的时候,如果程序员发现没法在 Java 中实现,而需要借助 JNI 和另一门语言,程序员就会很失望。为什么我要用上两门语言呢?干脆我就用另外一门好了,比如C /C++ .
此外,用Java Swing 写的程序总和使用操作系统的API 写的程序有着细微的差异,比如拖拽Drag And Drop。 .在Java中, 需要先选中,然后按下鼠标左键不放,移动鼠标,再释放。而Windows 的拖拽模式不需要事先选中,这样的结果就是,用户经常需要拖拽两次才能成功,除非凑巧已经选中了。这样的例子很多,归根结底是因为Swing 是emulated ,Swing不使用操作系统提供的窗口控件。SWT 是封装了操作系统的原生窗口控件。用 SWT写的程序会和操作系统的原生程序一样。但是在不同的操作系统上会有差异。有人说这是一个SWT的缺点,本人以为这恰恰是SWT 的一个优点。 Java 总是强调自己的程序不受限于某一个操作系统,如果不能使用操作系统的原生功能,其实我们恰恰被限制在Java 这个系统下面。Java本身也是一个平台。
转载请保留http://www.blogjava.net/xilaile/archive/2007/02/16/100016.html