2010-03-02 55 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交互的任何調用。

相關問題