SwingUtilities中invokeLater和invokeAndWait的介绍

在Java中Swing是线程不安全的,是单线程的设计,这样的造成结果就是:只 能从事件派发线程访问将要在屏幕上绘制的Swing组件。事件派发线程是调用 paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方 法,例如,ActionListener中的actionPerformed方法在事件派发线程中调用。

Swing是事件驱动的,所以在回调函数中更新可见的GUI是很自然的事情,比 如,有一个按钮被按下,项目列表需要更新时,则通常在与该按钮相关联的事件 监听器的actionPerformed方法中来实现该列表的更新,从事件派发线程以外的 线程中更新Swing组件是不正常的。

有时需要从事件派发线程以外的线程中更新Swing组件,例如,在 actionPerformed中有很费时的操作,需要很长时间才能返回,按钮激活后需要 很长时间才能看到更新的列表,按钮会长时间保持按下的状态只到 actionPerformed返回,一般说来耗时的操作不应该在事件处理方法中执行,因 为事件处理返回之前,其他事件是不能触发的,界面类似于卡住的状况,所以在 独立的线程上执行比较耗时的操作可能更好,这会立即更新用户界面和释放事件 派发线程去派发其他的事件。

SwingUtilities类提供了两个方法:invokeLate和invoteAndWait,它们都使 事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时, 就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代 码块。

只有从事件派发线程才能更新组件。

程序示例:更新组件的错误方法

startButton.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
   GetInfoThread t = new GetInfoThread(Test.this);
   t.start();
   startButton.setEnabled(false);
  }
  });

  class GetInfoThread extends Thread {
Test applet;
public GetInfoThread(Test applet) {
  this.applet = applet;
}
  public void run() {
  while (true) {
   try {
   Thread.sleep(500);
   applet.getProgressBar().setValue(Math.random() * 100);
   } catch (InterruptedException e) {
   e.printStackTrace();
   }
  }
  }
}

时间: 2025-01-21 13:43:22

SwingUtilities中invokeLater和invokeAndWait的介绍的相关文章

SwingUtilities中invokeLater和invokeAndWait介绍

   在Java中Swing是线程不安全的,是单线程的设计,这样的造成结果就是:只能从事件派发线程访问将要在屏幕上绘制的Swing组件.事件派发线程是调用paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方法,例如,ActionListener中的actionPerformed方法在事件派发线程中调用.   Swing是事件驱动的,所以在回调函数中更新可见的GUI是很自然的事情,比如,有一个按钮被按下,项目列表需要更新时,则通常在与该按钮相关联的事件监听器的actio

Excel 2010 中条件格式新增功能介绍

Excel 2010 中条件格式新增功能介绍这篇文章的内容如下: 下面介绍Excel 2010中一些新的条件格式功能: 交叉表引用 健壮的错误处理 性能增强 交叉表引用 在Excel 2010中,可以创建引用工作簿中不同工作表的条件格式.这意味着,在使用条件格式时,不再需要复制或链接数据到同一工作表. 例如,看看某连锁书店每月销售数据,该书店采用如下方式组织销售数据: 每个位置有自已的工作表 最后一个工作表包含全公司累计销售数据,使用每个部门的平均值. 下面我们应用条件格式,以便能够容易判断是否

Excel2007中网格线的基本用法介绍

Excel2007中网格线的基本用法介绍 Excel2007中的网格线在编辑.打印操作中都会用到.下面讲解Excel2007软件中网格线的一些基本用法. 1.隐藏/显示网格线 通过"视图"选项卡菜单中的"网格线"复选框开关,你可以设置网格线在编辑表时候的显示与否,   2.打印输出网格线设置 Excel中默认的网格线在打印时候是不会输出的,除非你进行了单元格的边框设置.设置方法:"开始"选项卡菜单中"字体"栏的"边框

Python中的with...as用法介绍

  这篇文章主要介绍了Python中的with...as用法介绍,本文直接给出用法实例,需要的朋友可以参考下 这个语法是用来代替传统的try...finally语法的. 代码如下: with EXPRESSION [ as VARIABLE] WITH-BLOCK 基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法. 紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量.当with后面的

Python2.x版本中maketrans()方法的使用介绍

  这篇文章主要介绍了Python2.x版本中maketrans()方法的使用介绍,是Python学习中的基础知识,需要的朋友可以参考下 maketrans()方法返回的字符串intab每个字符映射到字符的字符串outtab相同位置的转换表.然后这个表被传递到translate()函数. 注意:两个intab和outtab必须具有相同的长度. 语法 以下是maketrans()方法的语法: ? 1 str.maketrans(intab, outtab]); 参数 intab -- 这是实际字符

Ruby中操作文件的方法介绍

  这篇文章主要介绍了Ruby中操作文件的方法介绍,是Ruby学习当中的基础知识,需要的朋友可以参考下 Ruby提供了一套完整的I/O相关的内核模块中实现方法.所有I/O方法来自IO类. 类IO提供了所有的基本方法,如 read, write, gets, puts, readline, getc 和 printf. 本章将涵盖所有可供在Ruby中使用的基本I/O功能.如需使用更多的功能,请参考Ruby的IO类. puts 语句: 在前面的章节中,你指定值的变量和然后使用声明 puts 输出.

winXP系统中磁盘分区的技巧介绍

  winXP系统中磁盘分区的技巧介绍          1.一分钟内分区及格式化硬盘 右键点击"我的电脑",选择"管理"命令.在打开的"计算机管理"窗口中,依次展开"计算机管理"→"存储"→"磁盘管理"项.之后,在右侧窗格中即可看到当前硬盘的分区情况. 在"未指派"的磁盘空间上点击右键,选择"新建磁盘分区"命令.在弹出的磁盘分区向导窗口中,选择分

在EXCEL表格中使用透视表方法介绍

  EXCEL表格可以说使我们最常用的一个办公软件了,透视表可以让我们更加清晰的看到我们在数据源中需要的部分的数据,可以节约大量的时间,这样分析出来的数据也比较的准确,更加浅显易懂,今天我就来给大家介绍一下透视表的用法,用它来统计分析数据可以直观的看出问题所在,给领导们做决策提供强有力的依据. 方法/步骤 第一步.启动excel程序,打开一张你需要透视的数据源的表格,然后我们要选中我们需要透视的部分,一般我自己会用"Ctrl+A"选中整张表,如图所显 2.鼠标点击表格上方的插入选项,然

JavaScript中使用Callback控制流程介绍

 这篇文章主要介绍了JavaScript中使用Callback控制流程介绍,本文讲解了callback的一些问题和优化后的写法并给出代码实例,需要的朋友可以参考下     javascript中随处可见的callback对于流程控制来说是一场灾难,缺点显而易见: 1.没有显式的return,容易产生多余流程,以及由此引发的bug. 2.造成代码无限嵌套,难以阅读. 下面就来说说怎么解决避免上述的问题. 第一个问题是一个习惯问题,在使用callback的时候往往会让人忘了使用return,这种情况