读书人

Java Swing 学问篇 - EDT

发布时间: 2013-03-28 10:20:24 作者: rapoo

Java Swing 常识篇 - EDT
pakage org.dui.sampleimport java.awt.BorderLayout;import javax.swing.JFrame;import javax.swing.JTextField;import javax.swing.SwingUtilities;/** * <code>NotInEDTSample</code> just demonstrates the usage of Swing EDT simply. * * @author Jimmy.haung(SZ Team) * @since <i>DUI (Mar 25, 2013)</i> */public class NotInEDTSample extends JFrame {private static final long serialVersionUID = 1L;private JTextField m_txt;public NotInEDTSample() {initGUI();notInEDT();}/** * Init the GUI */public void initGUI() {this.setTitle("a simple EDT Sample");m_txt = new JTextField();getContentPane().add(m_txt, BorderLayout.CENTER);}/** * Process not under the EDT. 这里我启动了10个线程来改变<code>m_txt</code>的内容. */private void notInEDT() {for (int i = 0; i < 4; ++i) {new Thread(new Runnable() {@Overridepublic void run() {while (true) {m_txt.setText("我不在EDT中操作!");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}}/** * Launch the application. */public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {public void run() {try {NotInEDTSample oFrame = new NotInEDTSample();oFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);oFrame.setLocationRelativeTo(null);oFrame.setSize(300, 200);oFrame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}}

???? 运行上面的程序,然后点击几下界面后,界面就‘死掉’了(大家可以Resize看一下,或者点击一下窗口的Close按钮),‘死掉’有可能是死锁造成的,只是可能,但是程序也没有报Exception,这就是不确定性,如果Swing的stub不在EDT里面运行,带给程序很多的不确定性。在我以前看到的项目中,由于EDT的原因,引发可各种不可预测的Exception。

如果我们将上面的程序稍微改一下,将notInEDT的方法改成下面的样子:

private void notInEDT() {for (int i = 0; i < 4; ++i) {new Thread(new Runnable() {@Overridepublic void run() {while (true) {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {     m_txt.setText("我在EDT中操作!");}});try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}}

???? ?通过修改是不是发现没前面的问题了。但是有一些新学的朋友会问,如果本来就在EDT中就不用再加入到EDT, 但是如何才知道当前的线程是否是EDT呢,请看SwingUtilities.isEventDispatchThread();想得多周到的开发Swing的人员!SwingUtilities、SwingUtilities2、SwingUtilities3这几个类在以后都会经常用到,非常方便。看了上面的例子,大家有什么感想呢?

?????? 下面我们接着来写一个例子,我们试想一下,如果在EDT中执行一些时间长的任务会怎样呢?

?

import java.awt.BorderLayout;/** * <code>NotInEDTSample</code> just demonstrates the usage of Swing EDT simply. *  * @author Jimmy.haung(SZ Team) * @since <i>DUI (Mar 25, 2013)</i> */public class LongTaskSample extends JFrame {private static final long serialVersionUID = 1L;private JButton m_btn;public LongTaskSample() {initGUI();initEventHandler();}/** * Init the GUI */public void initGUI() {this.setTitle("a simple EDT Sample");m_btn = new JButton("click me to process long task");getContentPane().add(m_btn, BorderLayout.CENTER);}/** * Bind the event to the component. */public void initEventHandler(){m_btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {longTask();}});}/** * Use about five seconds to process this task. */private void longTask() {//为true,请看 #main(String[])System.err.println(SwingUtilities.isEventDispatchThread());try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}/** * Launch the application. */public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {public void run() {try {LongTaskSample oFrame = new LongTaskSample();oFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);oFrame.setLocationRelativeTo(null);oFrame.setSize(300, 200);oFrame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}}

????????

???????点击了按钮后,我们发现程序死掉了大约5秒后,就醒来了,这就是“装死”的现象。所以我们看到在EDT里面运行时间长的任务的结果会引发什么后果,就会觉得很慢。上面的两个例子只是说明了一丁点的问题。在大家以后的项目中将会遇到更多问题。那么现在的问题是如果来改善上面的问题,我们应该在其他的线程中执行时间长的任务,而在EDT只是负责界面的显示,以及界面数据的修改、获取等,这以后还会讲,在这里提示一下,SwingWorker可以很好解决上面的问题。马马虎虎终于完成了第一篇文章。如果新学的朋友,还是不懂得话,请看http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html。如果还是不明白,不要紧,以后会慢慢体会到的。前面的几篇的文章将会将一些Swing基本的东西,讲完基础的东西后将会开始我们的Fast-DUI之旅。预告一下,下一章将会是布局(Layout),如何简单使用布局管理器来实现复杂的布局。

???这里先预告一下我们以后要构建Fast-DUI的LAF(这只是其中的一种Skin,大家可以根据自己的情况来改变Skin),如下图:


Java Swing 学问篇 - EDT
?

读书人网 >编程

热点推荐