快速业务通道

用Swing编写灵敏的图形用户界面 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
以下的问题。虽然从感觉上,按钮已经弹起来了,但是在Done.出现之前,我们却无法按下这个按钮。可以说按钮还是定住了,只不过定在了弹起的状态。调用重绘方法无法从根本上解决问题,因此我们需要寻求其他的方法。

使用多线程

有效的解决方法是使用多线程。首先看一看一个更好的解决方案,这一方案是在参考《Rethinking Swing Threading》的一个程序片段完成的:

final String[] str = new String[1]; this.jTextArea1.setText("Please wait..."); this.repaint(); new Thread() {  public void run() {   try {    Thread.sleep(1000L);   }catch(InterruptedException e) {    e.printStackTrace();   }   str[0] = "Done.";   javax.swing.SwingUtilities.invokeLater(new Runnable() {    public void run() {     jTextArea1.setText(str[0]);    }   });  } }.start();

在这个程序中,要花费大量时间的操作被放到另一个线程当中,从而使事件响应方法能快速返回,event-dispatching thread就可以更新UI和响应其它事件了。注意到这个程序使用了invokeLater()方法。invokeLater()方法的作用是让event-dispatching thread去运行制定的代码。当然也可以不使用invokeLater()方法,但是这样就违背了单一线程原则,同时带来了一定程度的相对多线程的不安全性。到现在,解决方案似乎是完美的了,但是我们看一看在原来的程序添加下面的代码,尽管我们通常不这样做。

public void paint(java.awt.Graphics g) {  super.paint(g);  g.drawRect(1, 1, 100, 100); }

我们会发现以前画的矩形被覆盖了一部分,原因是由于我们没用重画这一个矩形,因此在结尾加上对repaint()方法的调用。

final String[] str = new String[1]; this.jTextArea1.setText("Please wait..."); this.repaint(); new Thread() {  public void run() {   try {    Thread.sleep(1000L);   }catch(InterruptedException e) {    e.printStackTrace();   }   str[0] = "Done.";   javax.swing.SwingUtilities.invokeLater(new Runnable() {    public void run() {     jTextArea1.setText(str[0]);     repaint();    }   });  } }.start();

用Swing编写灵敏的图形用户界面(3)

时间:2010-07-19

如果你认为这段代码过于缺乏可读性,可以通过SwingWorker来简化编程的方法。可以通过实现一个construct()方法来实现花费大量时间的操作和重写finished()方法来完成组件更新的工作。

this.jTextArea1.setText("Please wait..."); final SwingWorker worker = new SwingWorker() { public Object construct() {  try {   Thread.sleep(1000L);  }catch(InterruptedException e) {   e.printStackTrace();  }  return "Done."; } public void finished() {  jTextArea1.setText(getValue().toString());  repaint(); } }; worker.start();

以上的编程方式可以称为同步方式。另外作者提出了一个通过消息机制来实现相同功能的更清晰,但是需要编写更多代码的"异步"的方法。

结论

总之,我们在编写使用Swing组件的程序是要记住以下几点:

1、不要过多地占用event-dispatching thread;

2、与更新组件相关的代码要使用event-dispatching thread去执行;

3、要更新组件。

编写反应灵敏的图形用户界面还需要考虑很多问题,以上只是最基本的一部分。欢迎有兴趣的读者来信进行讨论。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号