某些人一拍脑袋的事,让我有机会跟Swing干上了,因为项目组没人用这玩意整过这东西,那就只能我硬着头皮上了!
有时候人是要有点压力才行的。
第一阶段的开发
准备阶段:工具的选择。用了Netbeans 6,试用了下,感觉画界面还比较容易,但是生成的代码很长,刚开始对Swing很陌生 ,看着netbeans 生成代码很头痛,感觉不是我想要的东西,然后放弃了。然后是VE,因为也只是倒腾了下,没细看。最后选择了Jigloo ,但是用了之后才知道他生成的代码也很恶劣......
开发阶段:别熟悉swing 边开发,其中遇到乱七八遭事情一堆,但是因为这个软件的功能是比较简单的,最后终于是拿了出来,虽然BUG一堆,但是也算是我的第一swing作品,客户感觉效果很不理想(有软件设计方面的,也有技术运用方面的),也就有了下面继续开发的经历了。
主要技术方面问题是,线程的乱用造成死锁,经常造成莫名的假死。
第二阶段的开发:
因为第一阶段的开发比较痛苦,所以决定换个语言开发。因为最近RIA比较热,RIA里面的adoble的air也算比较热门的,UI给人感觉很华丽,也自己尝试做过一些DEMO。项目中用的webservice,加密解密操作,文件上传下载都有解决的办法,但是要命的是这个项目中要调用外部程序,air在这方面比较脆弱,google了一把 as 的 fscommand 能调用其他程序,但是 air 竟然不支持这个,后来还是塌塌实实用SWING 吧。
然后又试用了一把VE,感觉现在比上次我用的时候好多了,后来就把Jigloo换 VE了。
摆在眼前的就是如何运用好线程了。又google了一把,找到了swingworker 这个东西拉。从Java SE 6开始引进的SwingWorker能帮你轻松的编写多线程Swing程序,改善你Swing程序的结构,提高界面响应的灵活性,这正是我要的东西。
一个Swing程序中一般有下面三种类型的线程:
* 初始化线程(Initial Thread)
* UI事件调度线程(EDT)
* 任务线程(Worker Thread)
Swing程序只有一个用EDT,该线程负责GUI组件的绘制和更新,通过调用程序的事件处理器来响应用户交互。所有事件处理都是在EDT上进行的,程序同UI组件和其基本数据模型的交互只允许在EDT上进行,所有运行在EDT上的任务应该尽快完成,以便UI能及时响应用户输入。
Swing编程时应该注意以下几点:
1.从其他线程访问UI组件及其事件处理器会导致界面更新和绘制错误。
2.在EDT上执行耗时任务会使程序失去响应,这会使GUI事件阻塞在队列中得不到处理。
3.应使用独立的任务线程来执行耗时计算或输入输出密集型任务,比如同数据库通信、访问网站资源、读写大树据量的文件。
而我第一阶段开发的正是由于没有注意到这点导致整个程序效果不佳。
程序中有个事件处理都要访问Web服务,这些服务通常要许多秒后才能响应,在此期间,如果程序在EDT上进行Web服务交互,用户就不能取消搜索或者同界面交互,像这两种都不应该在EDT上运行。
图1显示了在A和B点之间,EDT不能处理UI事件,AB两点之间代表了程序访Web服务的IO操作时间:
javax.swing.SwingWorker类是Java SE 6中新出现的类,使用SwingWorker,程序能启动一个任务线程来异步查询,并马上返回EDT线程。图2显示了使用SwingWorker后,事件处理立即返回,允许EDT继续执行后续的UI事件。
原先就是都放在EDT上了,效果勉强也就难免了。而使用Swingworker启动一个任务线程就可以灵活响应界面。
下面讲讲他的用法:
SwingWorker的定义如下:
public abstract class SwingWorker<T,V> extends Object implements RunnableFuture
SwingWorker是抽象类,因此必须继承它才能执行所需的特定任务。注意该类有两个类型参数:T及V。T是doInBackground和get方法的返回类型,V是publish和process方法要处理的数据类型。
SwingWorker实现以下接口方法:
* boolean cancel(boolean mayInterruptIfRunning)
* T get()
* T get(long timeout, TimeUnit unit)
* boolean isCancelled()
* boolean isDone()
SwingWorker实现了所有的接口方法,实际上你仅需要实现以下SwingWorker的抽象方法:
protected T doInBackground() throws Exception
doInBackground方法作为任务线程的一部分执行,它负责完成线程的基本任务,并以返回值来作为线程的执行结果。继承类须覆盖该方法并确保包含或代理任务线程的基本任务。不要直接调用该方法,应使用任务对象的execute方法来调度执行。
在获得执行结果后应使用SwingWorker的get方法获取doInBackground方法的结果。可以在EDT上调用get方法,但该方法将一直处于阻塞状态,直到任务线程完成。最好只有在知道结果时才调用get方法,这样用户便不用等待。为防止阻塞,可以使用isDone方法来检验doInBackground是否完成。另外调用方法get(long timeout, TimeUnit unit)将会一直阻塞直到任务线程结束或超时。获取任务结果的最好地方是在done方法内:
protected void done()
在doInBackground方法完成之后,SwingWorker调用done方法。如果任务需要在完成后使用线程结果更新GUI组件或者做些清理工作,可覆盖done方法来完成它们。这儿是调用get方法的最好地方,因为此时已知道线程任务完成了,SwingWorker在EDT上激活done方法,因此可以在此方法内安全地和任何GUI组件交互。
没必要等到线程完成就可以获得中间结果。中间结果是任务线程在产生最后结果之前就能产生的数据。当任务线程执行时,它可以发布类型为V的中间结果,覆盖process方法来处理中间结果。后文还将提供这些方法的更多详细信息。当属性改变时,SwingWorker实例能通知处理器,SwingWorker有两个重要的属性:状态和进程。任务线程有几种状态,以下面SwingWorker.StateValue枚举值来表示:
* PENDING
* STARTED
* DONE
任务线程一创建就处于PENDING状态,当doInBackground方法开始时,任务线程就进入STARTED状态,当doInBackground方法完成后,任务线程就处于DONE状态,随着线程进入各个阶段,SwingWorker超类自动设置这些状态值。你可以添加处理器,当这些属性发生变化来接收通知。
最后,任务对象有一个进度属性,随着任务进展时,可以将这个属性从0更新到100标识任务进度,当该属性发生变化时,任务通知处理器进行处理。
我的使用感觉就是,象I/O操作,数据操作,网络操作等耗时的操作放到 doInBackground()中处理,任务执行中而非任务结束时发布数据,要调用publish方法.
publish方法时,SwingWorker类调度process方法。有意思的是process方法是在EDT上面执行,这意味着可以同Swing组件和其模型直接交互。可以实现你在处理任务时,给个进度条提示。相关例子
http://gceclub.sun.com.cn/Java_Docs/jdk6/html/zh_CN/api/javax/swing/SwingWorker.html 中有.
近日JDK 1.6u10发布,comsumer jre 的发布,我对swing 开发桌面程序充满信心
分享到:
相关推荐
SwingWorker是一个抽象类,用于在Swing线程外执行时间-consuming的操作。SwingWorker提供了一个简单的方式来执行长时间的操作,而不阻塞Swing线程。SwingWorker有两个主要方法:`doInBackground()`和`done()`。`...
Swing 线程的深入理解和 SwingWorker 基础知识介绍 Swing 是 Java 中的一种图形用户界面(GUI)工具包,用于创建桌面应用程序。然而,在使用 Swing 时,开发者经常会遇到线程相关的问题。本文将深入了解 Swing 线程...
swing swingworker wingworker wingworker
SwingWorker是Swing提供的一种机制,用于在后台线程(也称为工作线程或worker threads)中执行耗时任务,而不阻塞EDT。它允许在后台线程执行计算,同时在主线程更新UI,保持界面的响应性。SwingWorker支持两种类型...
### Java开发中的线程安全选择与Swing 在Java开发中,Swing作为构建桌面应用程序图形用户界面(GUI)的主要工具之一,其设计目标是为了提供一个强大、灵活且易于使用的框架。Swing允许开发者轻松创建自定义组件或...
SwingWorker是Java提供的一种机制,用于在后台线程执行耗时任务,同时保持UI的响应性。这篇博客“使用SwingWorker异步加载JTree”详细介绍了如何利用SwingWorker来加载大型数据集到JTree组件,避免阻塞UI。 首先,...
Java Swing 是Java平台上用于构建图形用户界面(GUI)的一个库,它是Java Foundation Classes (JFC)的一部分。在Swing中,你可以创建出丰富、交互性强的桌面应用,而且它的组件库提供了很多美观的外观和感觉。 ...
Swt一般情况不允许在另外一个线程中更新控件内容,此程序使用java swing的SwingWorker对swt的控件进行操作更新。对于喜欢使用SwingWorker更新Swing控件的人来说,也可以使用SwingWorker更新Swt控件
Swing_hack是一个关于Java Swing库的专题,它聚焦于如何优化、调整和解决Swing组件中的各种问题,以及如何利用Swing进行高效且复杂的GUI编程。Swing是Java平台上用于构建图形用户界面(GUI)的工具包,它是Java ...
Swing是Java GUI(图形用户界面)库的一部分,主要用于创建桌面应用程序。它是Java Foundation Classes (JFC)的一部分,提供了一套丰富的组件,用于构建功能强大的、具有吸引力的用户界面。Swing是在Java 1.2版本中...
《用Swing写的一个RPG游戏》是一款基于Java Swing库开发的角色扮演游戏(Role-Playing Game,简称RPG)。Swing是Java提供的一种用于构建桌面应用的GUI(图形用户界面)工具包,它允许开发者创建丰富的交互式用户界面...
在Java的Swing库中,鼠标事件(Mouse Events)是用户与GUI组件交互的重要部分,而loading效果则通常指的是在处理耗时操作时显示的一种视觉指示,以告知用户程序正在运行且尚未完成。本篇文章将深入探讨如何在Swing...
在实际应用中,我们需要将不确定进度条与后台线程(例如,通过SwingWorker或者Thread)结合,以便在后台执行任务时显示进度条。后台任务完成后,关闭进度条: ```java // 创建后台任务 SwingWorker, Void> worker =...
### Swing速度慢与响应迟钝的原因及解决方案 #### 原因分析 Swing作为Java图形用户界面(GUI)开发的重要框架之一,在实际应用中可能会出现速度慢和响应迟钝的问题。这类问题主要源于程序员对Swing事件处理机制的...
Swing是Java编程语言中用于构建用户界面的GUI(图形用户界面)工具包,它是Java Foundation Classes (JFC) 的一部分。这篇博文“对Swing的一点理解(一)”可能探讨了Swing的基本概念、组件使用以及如何通过源码实现...
Java Swing 是Java GUI开发的一个重要库,主要用于创建桌面应用程序。在这个"java Swing 文件批量上传 DEMO 源代码"中,我们关注的核心是利用Swing构建一个用户界面,实现文件和文件夹的批量上传功能。这涉及到多个...
此外,Swing还包含了对Swingworker的支持,这是一个线程类,用于在后台执行耗时的任务,同时保持UI的响应性。这在处理大量数据或网络操作时非常有用,避免了用户界面的冻结。 总之,开源Java Swing是一个功能全面且...
在这个"java swing 画图板"项目中,开发者仿照了Windows操作系统中的“画图”程序,提供了一个基本的绘图环境。下面将详细讨论相关的Java Swing知识点。 1. **组件(Components)**:在Swing中,JFrame是窗口的基础...
"Swing这一刀"指的是在Java编程领域中对Swing库的深入理解和应用。Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和功能,用于创建桌面应用程序。这篇博客文章可能详细探讨了Swing在构建用户界面...
8. **SwingWorker**: 为了解决Swing GUI线程(事件分发线程)与长时间运行任务之间的同步问题,Swing提供了一个SwingWorker类。它允许在后台线程执行耗时操作,同时更新UI以反映任务的进度或结果。 9. **对话框...