- 浏览: 3119663 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (372)
- diy (4)
- linux (19)
- 杂项 (30)
- Swing (21)
- Java2D (21)
- Java3D (5)
- JavaIO (9)
- Java通讯 (5)
- Java设计模式 (3)
- Java多媒体 (0)
- Java算法 (7)
- Spring&EJB (29)
- Javaoffice (4)
- web前端 (23)
- javascript (1)
- php基础 (1)
- eclipse (3)
- 网站相关 (3)
- Apache (4)
- seo (12)
- db (28)
- server (3)
- api (4)
- 异常 (12)
- 计算机网络词汇表 (3)
- 随想录 (52)
- 收藏 (17)
- 犹太人的智慧 (3)
- 多线程 (1)
- jfreechart (7)
- Test (1)
- SorLib (30)
- ruby on rails (1)
最新评论
-
houyutao:
二三四都是错的空字符串也被匹配,*应该改成+
Java中判断字符串是否为数字的五种方法 -
mingyun:
但是 java.util.ArrayList 实现了 remo ...
java.lang.UnsupportedOperationException 解决方案 -
mingyun:
1.因为 Arrays.asList 返回的是 Arrays内 ...
java.lang.UnsupportedOperationException 解决方案 -
leolu007:
用java8新特性String testStr = " ...
java.lang.UnsupportedOperationException 解决方案 -
zhaohuaxishiwzw:
我之前所在的项目就是日本一家证券公司的项目。完全使用的是j2e ...
抛弃EJB(EJB2.0,EJB3.0,EJB4.0)
invokeLater,invokeAndWait是专门给Swing的线程安全准备的两个方法,Swing不是线程安全的,复杂的Swing交互一定要考虑多线程的问题。
在Java中Swing是线程不安全的,是单线程的设计,这样的造成结果就是:只能从事件派发线程访问将要在屏幕上绘制的Swing组件。事件派发线程是调用paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方法,例如,ActionListener中的 actionPerformed方法在事件派发线程中调用。
Swing是事件驱动的,所以在回调函数中更新可见的GUI是很自然的事情,比如,有一个按钮被按下,项目列表需要更新时,则通常在与该按钮相关联的事件监听器的actionPerformed方法中来实现该列表的更新,从事件派发线程以外的线程中更新Swing组件是不正常的。
有时需要从事件派发线程以外的线程中更新Swing组件,例如,在actionPerformed中有很费时的操作,需要很长时间才能返回,按钮激活后需要很长时间才能看到更新的列表,按钮会长时间保持按下的状态只到actionPerformed返回,一般说来耗时的操作不应该在事件处理方法中执行,因为事件处理返回之前,其他事件是不能触发的,界面类似于卡住的状况,所以在独立的线程上执行比较耗时的操作可能更好,这会立即更新用户界面和释放事件派发线程去派发其他的事件。
SwingUtilities类提供了两个方法:invokeLate和invoteAndWait,它们都使事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时,就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块。
只有从事件派发线程才能更新组件。
程序示例:更新组件的错误方法
错误分析:在actionPerformed中,监听器把按钮的允许状态设置为false,由于是在事件派发线程上调用actionPerformed,所以setEnabled是一个有效的操作,但是在GetInfoThread中设置进度条是一个危险的做法,因为事件派发线程以外的线程更新了进度条,所以运行是不正常的。
1.invokeLater使用
2.invokeAndWait
与invoikeLater一样,invokeAndWait也把可运行对象排入事件派发线程的队列中,invokeLater在把可运行的对象放入队列后就返回,而invokeAndWait一直等待知道已启动了可运行的run方法才返回。如果一个操作在另外一个操作执行之前必须从一个组件获得信息,则invokeAndWait方法是很有用的。
invokeLater和invoikeAndWait的一个重要区别:可以从事件派发线程中调用invokeLater,却不能从事件派发线程中调用 invokeAndWait,从事件派发线程调用invokeAndWait的问题是:invokeAndWait锁定调用它的线程,直到可运行对象从事件派发线程中派发出去并且该可运行的对象的run方法激活,如果从事件派发线程调用invoikeAndWait,则会发生死锁的状况,因为 invokeAndWait正在等待事件派发,但是,由于是从事件派发线程中调用invokeAndWait,所以直到invokeAndWait返回后事件才能派发。
actionPerformed();返回的时候事件派发线程才能派发线程,而在actionPerformed中使用invokeAndWait则会导致actionPerformed不能返回。所以也就无法派发invokeAndWait中的线程。
由于Swing是线程不安全的,所以,从事件派发线程之外的线程访问Swing组件是不安全的,SwingUtilities类提供这两种方法用于执行事件派发线程中的代码。
文章地址:http://javapub.iteye.com/blog/753801
在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(); } } } }
错误分析:在actionPerformed中,监听器把按钮的允许状态设置为false,由于是在事件派发线程上调用actionPerformed,所以setEnabled是一个有效的操作,但是在GetInfoThread中设置进度条是一个危险的做法,因为事件派发线程以外的线程更新了进度条,所以运行是不正常的。
1.invokeLater使用
class GetInfoThread extends Thread { Test applet; Runnable runx; int value; public GetInfoThread(final Test applet) { this.applet = applet; runx = new Runnable() { public void run() { JProgressBar jpb = applet.getProgressBar(); jpb.setValue(value); } }; } public void run() { while (true) { try { Thread.sleep(500); value = (int) (Math.random() * 100); System.out.println(value); SwingUtilities.invokeLater(runx); } catch (InterruptedException e) { e.printStackTrace(); } } } }
2.invokeAndWait
与invoikeLater一样,invokeAndWait也把可运行对象排入事件派发线程的队列中,invokeLater在把可运行的对象放入队列后就返回,而invokeAndWait一直等待知道已启动了可运行的run方法才返回。如果一个操作在另外一个操作执行之前必须从一个组件获得信息,则invokeAndWait方法是很有用的。
class GetInfoThread extends Thread { Runnable getValue,setValue; int value,currentValue; public GetInfoThread(final Test applet){ getValue=new Runnable(){ public void run(){ JProgressBar pb=applet.getProgressBar(); currentValue=pb.getValue(); } }; setValue=new Runnable(){ public void run(){ JProgressBar pb=applet.getProgressBar(); pb.setValue(value); } } } public void run(){ while(true){ try{ Thread.currentThead().sleep(500); value=(int)(Math.random()*100); try{ SwingUtilities.invokeAndWait(getValue);//直到getValue可运行的run方法返回后才返回 }catch(Exception ex){ } if(currentValue!=value){ SwingUtilities.invokeLater(setValue); } } }catch(Exception ex){ } } }
invokeLater和invoikeAndWait的一个重要区别:可以从事件派发线程中调用invokeLater,却不能从事件派发线程中调用 invokeAndWait,从事件派发线程调用invokeAndWait的问题是:invokeAndWait锁定调用它的线程,直到可运行对象从事件派发线程中派发出去并且该可运行的对象的run方法激活,如果从事件派发线程调用invoikeAndWait,则会发生死锁的状况,因为 invokeAndWait正在等待事件派发,但是,由于是从事件派发线程中调用invokeAndWait,所以直到invokeAndWait返回后事件才能派发。
actionPerformed();返回的时候事件派发线程才能派发线程,而在actionPerformed中使用invokeAndWait则会导致actionPerformed不能返回。所以也就无法派发invokeAndWait中的线程。
由于Swing是线程不安全的,所以,从事件派发线程之外的线程访问Swing组件是不安全的,SwingUtilities类提供这两种方法用于执行事件派发线程中的代码。
文章地址:http://javapub.iteye.com/blog/753801
发表评论
-
JFileChooser 只选(显示)文件夹
2012-06-29 11:17 3848小常识,就是总是忘,干脆整理下: JFileChooser f ... -
Swing免费皮肤Substance的使用
2010-10-25 16:22 22413关键词:Swing换肤,Substance,免费皮肤 Swi ... -
Swing 窗体关闭对话框提示
2010-10-20 17:56 6866关键词:Swing,关闭窗体,对话框提示 Swing关闭窗体 ... -
JTable表头排序的两种方法
2010-10-13 09:46 16620关键词:JTable,表头排序,线程安全 在Java6以前, ... -
基于Swing的图片倒影特效
2010-10-11 17:34 3745关键字:Swing,倒影特效,Graphics2D,Gradi ... -
怎样学习Swing
2010-09-27 16:36 3553Sun网站上的Java Tutorial就非常好,非常适合。它 ... -
Swing的第一推动力(转载)
2010-09-27 16:32 1628转载自[url]http://blog.sina. ... -
How to Write a Custom Swing Component
2010-09-27 16:29 2541When you hear comparisons betwe ... -
Swing页面属性的设置顺序
2010-09-15 15:35 4763这是一个细节问题,但 ... -
paint和paintComponent方法的关系
2010-09-15 14:12 15714关键词:swing,paint,paintComponent, ... -
Swing拖拽效果
2010-09-07 16:31 5202Swing的拖拽貌似挺复杂 ... -
Swing控件(JLabel,JButton....)设置字体和大小
2010-09-02 16:57 19907关键字:Swing控件,JButton,JLabel,字体,大 ... -
Java 拖动Swing组件和图片
2010-08-17 14:07 14470在Swing中拖动一个组件或者图片,我们抛开定位布局不说,是件 ... -
SwingUtilities.convertPoint 方法的作用
2010-08-17 13:38 6759SwingUtilities类是Swing组件 ... -
JTable 行 列 单元格 操作小结
2010-07-15 10:11 11073一.创建表格 1) 调用无参构造函数. JTable tabl ... -
JTable 保存单元格内容
2010-07-14 17:25 4193在开发过程中遇到这样一个问题,我编辑JTable里的内容,编辑 ... -
Swing, JTree拖拽的例子
2010-06-10 16:47 6258一个Java(JTree)拖拽的例子,其核心思想还是去实现Ja ... -
Swing JTable工厂(table4j)
2010-06-07 16:36 5248因为Swing提供的JTable用 ... -
Java Swing Border(Swing 边框) 归纳
2010-05-27 12:32 25744对Swing Border的一个小总结: 使用方法: Titl ... -
JFrame打开居中和相关设置
2010-05-13 15:51 7164对于JFrame,在界面初始化完成时,加入以下代码: //设置 ...
相关推荐
除了`invokeLater`,Swing还提供了`invokeAndWait`方法,它会阻塞当前线程直到指定的任务完成。但是,通常推荐使用`invokeLater`,因为它非阻塞性质允许应用程序保持响应性,特别是在处理耗时操作时。 总的来说,...
为了确保Swing组件的操作是在EDT中执行,Swing提供了`SwingUtilities.invokeLater(Runnable)`和`SwingUtilities.invokeAndWait(Runnable)`两个方法来帮助开发者解决线程安全问题。 - **SwingUtilities.invokeLater...
SwingUtilities.invokeLater和SwingUtilities.invokeAndWait等方法提供了一种安全的机制,可以在非EDT线程中安全地执行Swing组件的操作。 ### Lambda表达式与回调接口 Lambda表达式是一种允许将代码块作为方法参数...
在这个例子中,`SwingUtilities.invokeLater()`被用来在EDT中创建和显示一个`JFrame`。如果不在EDT中执行这些操作,可能会导致界面无法正确显示或者出现其他未定义的行为。 总的来说,理解和正确使用`EventQueue`...
为了确保UI更新操作能够在正确的线程中执行,Swing提供了一些方法,例如`SwingUtilities.invokeLater()`和`SwingUtilities.invokeAndWait()`。 2. **正确使用方法**: - 使用`SwingUtilities.invokeLater()`来异步...
- 使用`SwingUtilities.invokeLater`或`invokeAndWait`:这两个方法将任务添加到EDT的队列中,确保任务在线程安全的环境中执行。 - 创建独立的线程处理长时间任务,然后通过`invokeLater`或`invokeAndWait`在EDT上...
- 使用`SwingUtilities.invokeLater`或`invokeAndWait`方法将任务添加到EDT队列,确保在UI线程中安全地执行代码。 当事件发生时,EDT按照以下流程处理: 1. 事件调度线程从事件队列中取出事件。 2. 调用事件源组件...
- **SwingUtilities.invokeLater和SwingUtilities.invokeAndWait**:这两个方法用于确保Swing组件只能在EDT中更新。`invokeLater`会在EDT的末尾执行指定的任务,而`invokeAndWait`则会阻塞当前线程,直到指定的任务...
如果需要在非EDT线程中修改Swing组件,必须使用SwingUtilities的invokeLater或invokeAndWait方法。 SwingWorker是JDK 1.6引入的一个类,用于处理耗时任务。在doInBackground方法中执行计算密集型任务,然后通过...
Swing本身也提供了一些与线程交互的工具,如SwingUtilities的invokeLater()和invokeAndWait()方法,它们用于在EDT上安全地执行代码。例如,当飞机击中目标,分数更新的操作就需要通过invokeLater()方法添加到EDT的...
为确保线程安全,我们需要使用`SwingUtilities.invokeLater()`或`SwingUtilities.invokeAndWait()`方法来调度这些操作。 最后,为了让时钟看起来更美观,我们可以使用Swing的布局管理器(如`FlowLayout`、`...
可以使用`SwingUtilities.invokeLater`或`invokeAndWait`方法来实现。 这个Java电子时钟项目展示了如何结合多线程、GUI编程以及事件处理来创建一个实时更新的应用程序。通过阅读和理解提供的源代码,开发者可以加深...
这意味着我们的`TimerTask`不能直接修改UI,而是通过`SwingUtilities.invokeLater`或`SwingUtilities.invokeAndWait`来确保在EDT中执行。 此外,为了提升用户体验,可以添加一些额外的功能,比如设置时区、调整时钟...
因此,通常我们会使用SwingUtilities的invokeLater或invokeAndWait方法来确保所有对GUI的操作都在EDT中执行。 最后,第9章的第二部分可能涵盖了更高级的话题,比如对话框(JOptionPane)、拖放功能(Drag and Drop...
因此,你需要使用SwingUtilities的invokeLater或invokeAndWait方法来确保UI操作的正确性。 7. **国际化和本地化**:Swing支持多语言环境,开发者可以为不同的地区提供相应的资源文件,实现应用程序的国际化和本地化...
因此,涉及UI更新的操作必须在EDT中执行,可以通过SwingUtilities的invokeLater或invokeAndWait方法实现。 10. **可扩展性**:一个完善的记事本程序可能还包含其他功能,如查找替换、撤销重做、复制粘贴等。这些...
因此,你需要使用SwingUtilities的invokeLater或invokeAndWait方法来确保UI更新的正确性。 通过深入学习和实践Java Swing,你可以创建出高效、美观的桌面应用程序。本教程中的实例代码将帮助你更好地掌握Swing的...
因此,开发者需要了解和使用SwingUtilities的invokeLater和invokeAndWait方法。 通过"ch9"、"ch7"、"ch6"、"ch8"这些章节,我们可以依次深入学习Swing的高级特性、事件处理机制、组件的使用以及布局管理等内容,...
我们可以使用SwingUtilities的invokeLater()或invokeAndWait()方法确保代码在EDT中执行。 总的来说,学习Java Swing需要理解GUI组件、事件处理、布局管理和线程安全等核心概念。通过实际编写代码,结合本文档提供的...