介绍Swing线程相关处理

开发 后端
本文介绍Swing线程相关处理,简单地在actionPerformed()方法中添加线程,确保监听器在新的线程中执行照顾到了整个线程问题。

我们知道这将在非Swing线程中调用,因为该事件是直接在LookupManager中触发的,这将不是在Swing线程中执行。因为所有的代码功能上都是异步的(我们不必等待监听器方法允许结束后才调用其它代码),我们可以通过SwingUtilities.invokeLater()将这些代码改道到Swing线程。下面是新的方法,传入一个匿名Runnable到SwingUtilities.invokeLater():

  1. public void lookupCompleted(final LookupEvent e) {  
  2.  //notice the threading  
  3.  SwingUtilities.invokeLater( new Runnable() {  
  4.   public void run() {  
  5.    outputTA.setText("");  
  6.    String[] results = e.getResults();  
  7.    for (int i = 0; i < results.length; i++) {  
  8.     String result = results[i];  
  9.     outputTA.setText(outputTA.getText() + " " + result);  
  10.    }  
  11.   }  
  12.  }  
  13. );  
  14. }  

如果任何LookupListener不是在Swing线程中执行,我们可以在调用线程中执行监听器代码。作为一个原则,我们希望所有的监听器都迅速地接到通知。所以,如果你有一个监听器需要很多时间来处理自己的功能,你应该创建一个新的线程或者把耗时代码放入ThreadPool中等待执行。

最后的步骤是让LookupManager在非Swing线程中执行lookup。当前,LookupManager是在JButton的 ActionListener的Swing线程中被调用的。现在是我们做出决定的时候,或者我们在JButton的ActionListener中引入一个新的线程,或者我们可以保证lookup自己在非Swing线程中执行,自己开始一个新的线程。我选择尽可能和Swing类贴近地管理Swing线程。这有助于把所有Swing逻辑封装在一起。如果我们把Swing线程逻辑添加到LookupManager,我们将引入了一层不必要的依赖。并且,对于 LookupManager在非Swing线程环境中孵化自己的线程是完全没有必要的,比如一个非绘图的用户界面,在我们的例子中,就是Logger。产生不必要的新线程将损害到你应用的性能,而不是提高性能。LookupManager执行的很好,不管Swing线程与否--所以,我喜欢把代码集中在那儿。

现在我们需要将JButton的ActionListener执行lookup的代码放在一个非Swing线程中。我们创建一个匿名的Thread,使用一个匿名的Runnable执行这个lookup。

  1. private void searchButton_actionPerformed() {  
  2.  new Thread(){  
  3.   public void run() {  
  4.    lookupManager.lookup(searchTF.getText());  
  5.   }  
  6.  }.start();  
  7. }  

这就完成了我们的Swing线程。简单地在actionPerformed()方法中添加线程,确保监听器在新的线程中执行照顾到了整个线程问题。注意,我们不用处理像第一个例子那样的任何问题。通过把时间花费在定义一个事件驱动的体系,我们在和Swing线程相关处理上节约了更多的时间。

【编辑推荐】

  1. Swing线程解决方案
  2. 浅析Swing项目的开发
  3. 全面比较AWT和Swing
  4. 浅谈Swing绘画的处理过程
  5. 概述JSci.swing包的核心
责任编辑:佚名 来源: 51cto.com
相关推荐

2010-03-29 13:49:40

Nginx图片处理

2009-07-16 08:53:03

Swing任务Swing线程

2009-07-10 13:36:32

Swing容器

2009-08-05 18:28:05

C#异常处理

2009-07-10 18:06:59

JTree Swing

2009-07-15 10:37:28

Swing外观

2009-07-10 15:41:27

Swing AWT

2009-07-10 16:29:32

Swing组件

2010-03-17 19:24:38

Java多线程循环

2009-07-10 14:41:57

Swing技术

2009-07-17 11:13:46

AWT和SwingSwing组件

2009-07-15 16:03:26

Swing线程

2009-07-17 14:38:51

轻量级Swing组件

2009-07-15 10:23:51

Swing SWT集成

2009-07-15 17:09:32

Swing线程

2009-07-10 11:45:44

Java Swing

2009-07-17 15:30:30

JFaceAWT和SWTSwing

2010-03-18 16:19:02

Java自定义线程池

2009-07-16 11:19:48

外部线程Swing组件

2009-07-16 16:23:59

Swing线程
点赞
收藏

51CTO技术栈公众号