2011-04-17 86 views
1

我有一個簡單的JTabbedPane組件與兩個選項卡。當一個按鈕事件在其中一個選項卡上觸發時,我希望當前視圖立即設置爲的其他選項卡。我可以成功獲取當前選項卡,以便在有問題的按鈕的actionPerformed方法中使用setSelectedIndex(int)進行切換,但按鈕事件的其餘功能有時可能需要一段時間才能完成。Java JTabbedPane切換選項卡立即

似乎setSelectedIndex(int)更改不會立即發生,並且只有在按鈕單擊/按鈕觸發的actionPerformed方法的主體完成時纔會發生。

當按鈕被點擊/按下時,我想切換標籤的原因是,用戶可以在另一個標籤上的文本區域看到一條消息,告訴他們「正在處理,請稍候」等等,而剩餘的按鈕點擊功能被執行。該功能的結果,當他們到達時,將取代「......請稍候」的消息。

所以現在發生的事情是,我點擊按鈕,它凍結在該選項卡上,直到按鈕功能完全完成,然後切換。所以「......等待」信息實際上從來沒有見過。

我不知道該怎麼做。也許,爲「功能」創建一個新線程,讓按鈕單擊事件啓動線程,以便按鈕事件可以在等待結果時完成並切換選項卡。 只是大聲思考。任何幫助表示讚賞。

-Rob

+0

你可能想要做的事情實際上有些不同:如果你仔細想想,並且看到複雜的應用程序(如IDE),你會注意到它們通常不會打擾*「Please wait」*嵌入的消息在每個標籤/子標籤/子屏幕/任何應用程序。他們所做的就是將一個進度條放在應用程序的任意**部分,並從用戶所在應用程序的任何「部分」更新進度條。與一些瀏覽器總是顯示*%每個頁面的*總是加載在同一個地方。在我看來,這是一個更好的設計。 – SyntaxT3rr0r 2011-04-17 14:07:47

+0

一個進度條會很棒,但我對此有點急,而且我絕對沒有時間執行跟蹤剩餘時間的事情。我明白你的意思,但是,當你說簡單地把信息放在應用程序的某個普遍區域時,我可能會考慮它。 – Rob 2011-04-17 15:34:15

回答

2

這聽起來我,如果你有一個線程問題比什麼都重要,這是您的凍結GUI使其完全沒有反應,直到它完成,從而延緩你的標籤面板交換。如果您正在執行動作執行方法中運行任何長時間運行的進程,請在後臺線程中執行它們(例如由SwingWorker提供),然後您的GUI將變得更加快速響應。

有關此信息,請查看本教程:Concurrency in Swing

如果不顧這個意見,你仍然有問題,那麼你很可能將不得不發佈您的某些問題的代碼。最好的辦法是,如果你可以創建一個小型可編譯和可運行的應用程序來重現這個問題,一個SSCCE

Que tengas suerte!

+0

+1,瞭解EDT和單線程規則是學習Swing最重要的概念之一。教程鏈接對此非常重要。 – camickr 2011-04-17 14:52:24

+0

我最終通過使用invokeLater(new Runnable {etc ..)在actionPerformed方法中工作,但我會仔細看看EDT,只是爲了讓我更好地理解發生了什麼。 – Rob 2011-04-17 15:32:04

+0

在閱讀了關於EDT和SwingWorker的更多內容之後,看起來你是對的,SwingWorker確實是完成任何可能需要時間的後臺任務的方式。 GUI現在保持響應,因爲它應該是。謝謝。 – Rob 2011-04-19 18:10:26