(1)进行Java Gui编程,大家或许经常徘徊在SWT,SWING,AWT之间选择,哪一个更合适自己?
AWT的优势在于,简单,稳定,兼容于任何一个java版本。也支持GUI组件的自动disposal。同时也是线程安全的。在AWT 中的图形用户界面是通过本地方法来实现的,每个AWT 方法都有一个与其对应的本地方法,称为peer。由于平台无关性的需要,AWT 所能够实现的功能是各种不同操作系统的图形库所提供的功能的交集。
SWING,则是为了解决AWT的很多缺点。SWING 提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。 它们是JFC的一部分。 它们支持可更换的观感和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意观感。 轻量级元件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。
Eclipse项目用称为SWT的的图形库和工具包取代了Java标准中的AWT和Swing。SWT直接调用了操作系统的图形库,从而使得Java应用程序的Look & Feel 与操作系统的习惯完全一致;更为重要的是,对本地方法的直接调用大幅度的提高了基于SWT 的Java应用程序的运行速度。SWT 的缺点主要在于两点:(1) 不是Java语言标准;和(2) 支持的平台太少。
(2)应用程序中,事件监听线程的概念
一个进程中,特别是一个包含UI的进程,其主线程一般是事件监听线程。负责监听鼠标,键盘等事件,以及一些来自本程序代码里的一些消息。
而非UI线程,其一般没有事件监听线程。
该线程也称之为事件分发线程EDT,操作系统为每一个UI进程都准备了一个事件队列,EDT就是这个队列的消费者,一般来讲,除非你的应用程序停止,否则EDT会永不间断地徘徊在处理请求与等待请求之间。
单一线程的事件队列来说有两个非常突出的特性:
一、将同步操作转为异步操作。
二、将并行处理转换为串行顺序处理。
一般EDT有两条原则:
一、职责分明,任何GUI请求都应该在EDT中调用。
二、需要处理的GUI请求非常多,包括窗口移动、组件自动重绘、刷新,它很忙,所以任何与GUI无关的处理不要由EDT来负责,尤其是I/O这种耗时的操作。这个时候我们就需要使用工作者Worker线程。
通过EDT,使得不具备线程安全的Swing函数库避开了并发访问的问题。如果你也有一个不具备thread安全性的函数库并想在multithreaded环境下使用应该怎么办?只要你是从单一的thread来访问这个函数库,程序就不会遭遇到任何数据同步的问题。
if (!SwingUtilities.isEventDispatchThread())
{
try
{
SwingUtilities.invokeAndWait(new Runnable()
{
public void run ()
{
initialize(listener, config);
}
});
}
catch (Exception e)
{
}
}