Swing慢不慢?

这个问题很笼统,为什么大多数程序员初次接触到Swing后,有的甚至是别的领域如Windows Forms的专家,都有这种感觉,一些熟悉Swing框架的人可能认为Swing一点也不慢。

这涉及到了Swing单线程设计的问题,这个问题是老生常谈,相信不少同学已经熟悉,现在使用JDK1.6提供的SwingWorker大体能解决这部分问题,如果有同学批评Swing很慢,界面很简陋,会引起板砖无数,当然,对于熟悉Swing的专家来说,在程序设计中,长时间任务都通过SwingWorker通过后台线程处理,这是显而易见的,在我看来,对Swing的批评其实涉及到一个关于框架设计的原则问题,使用一个框架时一个简单的任务如果需要非常复杂的方法来实现,这个框架对用户来讲就不是非常友好的,Swing控件的所有方法都必须在EDT中调用,这就表明必须使用SwingWorker这样的机制,如果您直接开个Thread,所有的对界面元素的修改代码都必须使用SwingUtilities.invokeLater,这也是为什么SwingWorker存在的原因,而JavaME就可以直接在线程中调用GUI控件的方法。

Swing的单线程问题除了增加程序员的负担之外,还带来了副作用,如果仔细阅读Swing基础控件的源代码,就会更深刻的明白这个道理,Swing控件的界面库除了绘制例程之外,所有的其他例程,包括界面布局,文档内容修改,GUI事件都运行在EDT中,这就客观造成了大型Swing控件比方说JEditorPane打开网页时非常慢,因为对一个复杂的网页来说,有大量的标签需要生成,布局,计算,绘制,这就造成了GUI冻结,这时候SwingWorker就派不上用场了,这也可能是Swing个别控件本身设计的缺陷,即使使用SwingWorker将其中的一部分例程抽出来也非常难!

另外一个能够显著影响Swing界面程序的问题是大量的匿名内部类,前边提到,目前的Java语言还没有什么好办法来替代匿名内部类,只有新的Java Closure提议了解决单个方法接口的问题,而对于事件类型的匿名内部类没有好的解决办法,其实使用Swing开发桌面程序应该尽量避免生成大量的事件匿名内部类,应该将多个事件接口合并到一个内部类中,这也是Swing底层控件修改的原因,包括NetBeans IDE自动生成的方法也从原先的匿名内部来改成了新的单个类实现,Java的所有类包括匿名类,嵌套类都是单独的一个文件,针对大型的程序,如果有上千个Action,加载起来就非常慢,应该使用一个或者多个类,通过将Action对应到具体的方法来实现!

总之,批评Swing慢的同学也是有道理的,很简单的一个例子,同时打开微软的开发工具Visual Studio和NetBeans IDE,再打开项目和文件,就可明显感觉到差别,我个人也使用Visual Studio做过一段时间的C#开发,我的观点是Swing框架本身还是有一定缺陷的,当然这些缺陷有的可通过一些方法进行改善,有些就比较难,我们也在做一些研究,尝试着在新的控件中做一些改变!

你可能感兴趣的:(Swing慢不慢?)