Swing中的线程研究.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Swing中的线程研究

1 Swing的线程模式默认情况下,所有基于Swing的应用程序,都是开始于两个线程的。第一个就是主线程,它处理main方法里面的代码。第二个线程,是事件分发线程 (Event-dispatching thread),它负责处理事件、绘图和布局。两个线程的具体分工如下所示:启动一个Java应用程序时候,就会启动一个主线程,主线程主要做: 第一步:调用构造器在框架窗口中排列构件第二步:调用框架窗口的setVisible方法当显示出第一个窗口时,事件分发线程被创建。所有事件的处理,比如调用actionPerformed方法或paintComponent方法,都会自动在事件派发线程中执行。而主线程会保持运行直到main方法运行结束。2 Swing的线程规则Swing的线程规则:一旦Swing组件被具体化(realized),所有可能影响或依赖于组件状态的代码都应该在事件派发线程中执行。具体化的意思是组件的paint()方法已经或可能会被调用。一个作为顶级窗口的Swing组件当调用以下方法时将被具体化:setVisible(true)、show()或pack()。当一个窗口被具现化,它包含的所有组件都被具体化。另一个具体化一个组件的方法是将它放入到一个已经具体化的容器中。事件派发线程是执行绘制和事件处理的线程。例如:paint()和actionPerformed()方法会自动在事件派发线程中执行。另一个将代码放到事件派发线程中执行的方法是使用SwingUtilities类的invokeLater()方法。验证自己写的事件处理方法是否运行在事件分发线程可以使用SwingUtilities.isEventDispatchThread().这个方法。通过返回true或者false来表明是否你的方法时在事件分发线程里面被调用的。 3 Swing多线程程序的开发 在基于Java Swing进行图形界面开发的时候,经常遇到的就是Swing多线程问题。例如需要在一个图形界面上显示很多数据,这些数据是经过长时间、复杂的查询和运算得到的。如果在图形界面的同一个线程中(即事件分发线程)进行查询和运算工作则会导致一段时间界面处于死机状态,这会给用户带来不良的互动感受。为了解决这个问题,一般会单独另启动一个线程进行运算和查询工作,并随时更新图形界面。这时候,会出现一个问题:在Swing里,只能在与Swing 相同的线程里对GUI组件进行修改。也就是说,如果要执行类似于jLabel1.setText(blabla)代码,必须在Swing线程中,而不允许在其他线程当中。如果必须在其他线程中修改组件,可以使用以下类似方式解决: SwingUtilities.invokeLater(new Runnable() {   public void run() { jLabel1.setText(blabla);  } }invokeLater()方法的使用十分广泛,任何线程调用invokeLater()方法都可以在请求事件派发线程运行特定代码。将要运行的代码放到一个Runnable对象的run()方法中,并将此Runnable对象设为invokeLater()的参数。invokeLater()方法会立即返回,不等待事件派发线程执行指定代码。 需要注意的是,在invokeLater做的任何事情,都会导致Swing线程窗口绘制工作暂停下来,等候invokeLater工作结束。所以不要在invokeLater进行耗时操作,尽量只执行那些界面绘制相关的工作。可以通过代码重构,将那些与界面更新相关的代码集中起来统一处理。 4 invokeLater的使用实例/** * 测试JTable添加数据,删除数据频繁操作,JTable出现数组越界的处理 * 在工作中如果遇到频繁的操作Jtable的数据,特别是速率很快的情况下,经常会遇到 * Exception in thread AWT-EventQueue-0 java.lang.ArrayIndexOutOfBoundsException * 这样的数组越界的异常,这里引入Swing的一个线程,能很好的解决这个问题 * 供同样遇到这样问题的人参考。 * */public class ThreadTable extends JTable { private DefaultTableModel model;static String[] header = new String[] { ID, Name, Sex, Age };public ThreadTable() { model = new DefaultTableModel(header, 0); this.setModel(model); } public void deleteR

文档评论(0)

xy88118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档