最近为一个东西写个界面,觉得用SWT&JFace比较麻烦,再说JFace我也没完全会,就干脆用Swing了。不过发现Swing和SWT貌似还是有比较多的不同的。所以,仔细看了看。下面是收集的资料。中文的资料多半都是翻译的Introduction To Swing Application Framework的,但是翻译的很烂。推荐把这篇文章放到最后读,因为这篇文章写的不是很好,属于不懂的人看了不太懂,懂的人看了就更懂的那种,简单来说细节写的不清楚,盲点很多。
学Swing应用程序框架估计主要要了解以下几点:
1. 应用程序框架提供了什么功能,如何帮助用户管理应用程序的各个方面的。(想必下面这个图已经说明的很清楚了,大家只要照着图,按图索骥,把几个类之间的关系和功能搞明白就行了)
2. Swing中的工作线程(这个主要就是要把工作线程和事件派发处理线程之间相互独立出来 ,以免造成界面假死的情况。再就是这么做了之后,就涉及到两个线程之间的通信问题。主要就是搞清楚如何写工作线程,以及工作线程如何和事件派发处理线程相互交互的)
3.再就是一些高级玩意了,如何把bean和某个组件进行绑定,将界面操作省时省力的直接反映到DB中。
Swing Tutorial Swing教程
http://java.sun.com/docs/books/tutorial/uiswing/
(主要介绍了Swing的基本构成,基础的基础,知道组件,容器和布局,以及Swing中的并发的可以跳过)
Using the swing application framework 如何使用Swing应用程序框架
http://java.sun.com/developer/technicalArticles/javase/swingappfr/
(一篇快速入门的好教程)
Improve Application Performance with SwingWorker In J2SE6 如何利用SwingWorker改进程序性能
http://java.sun.com/developer/technicalArticles/javase/swingworker/index.html
(Swing中的工作线程的问题)
Swing & Thread Swing和线程
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
(还是工作线程的问题)
Introduction to swing application framework Swing应用程序框架介绍
https://appframework.dev.java.net/intro/index.html
(这篇文章还是介绍,主要解决快速入门中某些没提到的盲点的,也是一篇总览性的文章)
补充:
关于SwingTask&Task
Task是Swing应用程序框架对SwingTask的一个补充之后的子类,除了添加点无关紧要的方法,没多大变化,所以下面对这个表示工作的类做一个无差别性的叙述。
在Swing里面主要有三类线程,
一类启动其他两类线程,所以又叫做初始线程
一类构造UI并且处理UI上面产生的点击等事件,所以又叫做事件派发线程,Event Dispatcher Thread,简称EDT。这类线程必须通过SwingUtilities里面的invokeLater以及变种方法来启动。
还有一类就是后台工作线程。
为了避免直接在EDT上面处理耗时的任务,卡在那里,影响了UI的重画,造成界面假死,所以要用后台的工作线程来处理这类耗时的任务。完成了后台耗时的任务之后,还需要把结果返回给UI线程,然后让其在界面上面显示。为此,设计了一个Task类,这个类包含了3个重要的三个方法。
doInBackground方法 所有耗时的工作都在这个方法内完成,这个方法将运行在工作线程上。完成后返回结果值,Task类自动帮你把结果存好。
get方法 这个方法就用来取得结果的。一般在done方法里面使用这个get方法
done方法 当doInBackground完成任务,返回结果,并且被Task类自动存好后,就会在EDT线程上面调用这个方法,你可以在这个方法里面用get方法获得处理的结果,然后将其显示到UI上面。
问题来了,当你集成了Task,写好了这3个方法,如何启动这个后台任务呢?
那就需要你在其他两个线程中,调用Task的execute方法了,当这个方法调用之后,Task类就自动建立一个工作线程,然后把 doInBackground放在这个线程里面跑,跑完了这个工作线程就结束了。然后,就自动切到EDT线程上,掉用done方法,done方法中利用 get取得结果,显示到UI上面。(如何放到UI上面显示呢,这就要靠你在new一个Task的时候,把UI的引用传进来了,或者你就干脆建成一个UI类的静态内部类,又叫嵌入类来着吧,你就省掉传UI的引用的麻烦了)
在Swing应用程序框架中,你只需要实现一个返回Task类型的事件处理方法,框架会自动调用Task的execute方法,你就省去手动调用的麻烦了。
还有个问题,Task类是如何把done放到EDT上面执行的呢? 这个我还没弄明白。希望深入了解的人指导一下。
【编辑推荐】