2010-04-28 96 views
1

我開始使用CheckThreadViolationRepaintManager來檢測EDT違規。爲什麼會發生EDT違規?

它抱怨:

partner = getParameter("partner",generatePartnerSelectionPanel(),Design.partnerSelectionDuration); 

因爲它不喜歡generatePartnerSelectionPanel(),因爲它不喜歡這種方法JPanel panel = new JPanel();。但是我不明白爲什麼會有這個問題。

在更多的細節,generatePartnerSelectionPanel()產生一個JPanel(我這樣做不是在美國東部時間),但是,在getParameter我添加的JPanel到主JFrame的,我(使用invokeLater)做在EDT。

那麼,爲什麼會有問題?

回答

3

的EDT違規並不意味着事情一定出問題,就意味着你試圖做的比其他EDT線程相關的操作的GUI(的情況下的東西可能出問題)。

創建一個新的Swing組件包含在「執行某些與GUI有關的事情」中,因此警告違規。

forum has quite a discussion爲什麼不建議在其他線程上創建Swing組件。

0

擺動是線程敵對的。即使某個組件未實現,它仍然可以訪問共享資源或致電EventQueue.invokeLater。有一段時期,人們普遍認爲Swing組件可以創建,但這是不正確的。

0

除了使用CheckThreadViolationRepaintManager以外,我一直使用面向方面的解決方案來檢測任何Swing組件是否構建在EDT之外。如果您使用AspectJ,這是一種排查EDT違規的優雅方法。

看到這個博客帖子的細節:

Debugging Swing, the final summary

+0

該鏈接不再工作。你有新的地址嗎? – peterboston 2015-12-25 23:15:17

+0

看起來像甲骨文打破了鏈接。對不起,我找不到有效的鏈接。 – jenglert 2016-01-07 00:18:07

2

通常,如果你在主交給你線程創建任何GUI組件會出現這種情況。現在

,在現實中沒有什麼不好,只要你不修改它永遠不會發生,你已經意識到後(setVisible(true)pack()將實現幀),但是Sun發現,他們聲稱使它這樣一些邊緣情況這可能會導致問題。

因此,要完全正確地讓您的主要構造您的第一個窗口裏面invokeLaterinvokeAndWait

實際上,我想知道如果在invokeLater之後立即退出主線程,可能會允許您的整個應用程序退出(因爲窗口幾乎肯定還沒有時間出現)。您可能要使用invokeAndWait,除非你的主線程不會退出。