Java开发中的线程安全选择与Swing - 编程入门网
JOptionPane.showMessageDialog( myMainFrame, "Hello There");} }; SwingUtilities.invokeAndWait (showModalDialog);}
类似地,假设一个线程需要对GUI的状态进行存取,比如文本域的内容,它的代码可能类似这样: void printTextField() throws Exception {final String[] myStrings = new String[2];Runnable getTextFieldText = new Runnable() { public void run() {myStrings[0] = textField0.getText();myStrings[1] = textField1.getText(); }};SwingUtilities.invokeAndWait (getTextFieldText);System.out.println(myStrings[0] + " " + myStrings[1]);} 如果你能避免使用线程,最好这样做。线程可能难于使用,并使得程序的debug更困难。一般来说,对于严格意义下的GUI工作,线程是不必要的,比如对组件属性的更新。 不管怎么说,有时候线程是必要的。下列情况是使用线程的一些典型情况: 执行一项费时的任务而不必将事件派发线程锁定。例子包括执行大量计算的情况,会导致大量类被装载的情况(如初始化),和为网络或磁盘I/O而阻塞的情况。 重复地执行一项操作,通常在两次操作间间隔一个预定的时间周期。 要等待来自客户的消息。 你可以使用两个类来帮助你实现线程: ◆SwingWorker:创建一个后台线程来执行费时的操作。 ◆Timer:创建一个线程来执行或多次执行某些代码,在两次执行间间隔用户定义的延迟。 Java开发中的线程安全选择与Swing(4)时间:2011-01-24使用SwingWorker类 SwingWorker类在SwingWorker.java中实现,这个类并不包含在Java的任何发行版中,所以你必须单独下载它。 SwingWorker类做了所有实现一个后台线程所需的肮脏工作。虽然许多程序都不需要后台线程,后台线程在执行费时的操作时仍然是很有用的,它能提高程序的性能观感。 SwingWorker''s get() method. Here''s an example of using SwingWorker: 要使用SwingWorker类,你首先要实现它的一个子类。在子类中,你必须实现construct()方法还包含你的长时间操作。当你实例化SwingWorker的子类时,SwingWorker创建一个线程但并不启动它。你要调用你的SwingWorker对象的start()方法来启动线程,然后start()方法会调用你的construct()方法。当你需要construct()方法返回的对象时,可以调用SwingWorker类的get()方法。这是一个使用SwingWorker类的例子: ...// 在main方法中:final SwingWorker worker = new SwingWorker() { public Object construct() {return new expensiveDialogComponent(); }};worker.start();...// 在动作事件处理方法中:JOptionPane.showMessageDialog (f, worker.get()); 当程序的main()方法调用start()方法,SwingWorker启动一个新的线程来实例化ExpensiveDialogComponent。main()方法还构造了由一个窗口和一个按钮组成的GUI。 当用户点击按钮,程序将阻塞,如果必要,阻塞到ExpensiveDialogComponent创建完成。然后程序显示一个包含ExpensiveDialogComponent的模式对话框。你可以在MyApplication.java找到整个程序。 使用Timer类 Timer类通过一个ActionListener来执行或多次执行一项操作。你创建定时器的时候可以指定操作执行的频率,并且你可以指定定时器的动作事件的监听者(action listener)。启动定时器后,动作监听者的actionPerformed()方法会被(多次)调用来执行操作。 定时器动作监听者(action listener)定义的actionPerformed()方法将在事件派发线程中调用。这意味着你不必在其中使用invokeLater()方法。 这是一个使用Timer类来实现动画循环的例子: public class AnimatorApplicationTimer extends JFrame implements ActionListener {...//在这 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |