2010-03-02 56 views
0

如何在程序启动时在后台执行动作?我希望为此目的进行一些onLoad事件。只需要清楚:加载用户界面。根据我的事件结果做一些事情并加载更多的用户界面。在程序启动时在后台执行动作

+0

你是什么意思的“背景” - 在什么背后?如果加载用户界面发生在后台,那么它应该在前台运行什么?构建Swing UI必须在事件派发线程中发生。当然,你可以在其他一些线程中并行执行其他操作,例如在主线程上。 – 2010-03-02 10:44:48

+0

你能更详细地描述你的意思吗,或许给出一个你的意思的通用例子?你是说你开始加载用户界面,然后根据你在开始时没有意识到的一些配置选项,或者在启动过程中的一些用户交互,你从那一点选择加载哪个用户界面? – glenatron 2010-03-02 10:58:46

回答

3

看一看的SwingWorker。 Swing是单线程的,所以任何后台处理都需要从一个单独的线程完成,以避免阻塞swing(事件派发)线程。

还没有可用的onLoad类型功能,因此您需要在初始化gui时自行启动worker。

EventQueue类中有实用方法invokeLater()和invokeNow(),它们可以用来从另一个线程更新gui。它们允许您指定要在事件分派线程上运行的代码。

1

我不认为有“开始时在背景中做东西”的任何特定的API。但是你可以创建一个新的线程,这是用Java做背景的标准方式。

如果您不熟悉线程和并发编程,您可能需要一些时间才能了解您的需求。良好的开端是在Java教程:

http://java.sun.com/docs/books/tutorial/essential/concurrency/

+0

对于线程并不是什么新东西,但在我看来,从不同的线程触摸UI代码是一个糟糕的主意,这使我相信会有比线程稍微更先进的构造readdy – 2010-03-02 10:40:38

+0

实践中的Java并发 - 由Brian Goetz是一本很好的书,可以进入更高层次的并发抽象。它也有一个特定于GUI的部分。 – Luhar 2010-03-02 13:11:47

2

要添加到对象的回答以上:

如果您使用的是基于UI的应用程序,你应该使用的SwingWorker线程做任何非GUI相关工作。例如,所有Swing任务都在事件调度线程(EDT)上运行。如果你想在EDT上运行代码,你应该使用SwingUtilities方法。 invokeLater()将任务添加到EDT上当前的任务队列中,并且invokeAndWait()将运行该任务并阻塞直到完成。

如果您想确保EDT上没有运行的东西,可以使用SwingUtilities.isEventDispatchThread()调用来确定当前线程是否为EDT。

如果您正在从应用程序的main()方法初始化GUI,请确保在EDT上运行GUI组件可见或通常任何GUI交互的任何调用。

相关问题