2014-10-18 64 views
1

我有一個Swing應用程序來創建RPG字符。 它有一個嵌套JTabbedPane的體系結構,因此有一個HeroTabsPanel具有HeroPanels並且每個那些具有一些更多的標籤等的統計資料,物品等在基於JTabbedPane的Swing應用程序中導致性能下降的原因是什麼?

所以GUI由上部的選項卡式窗格的英雄,當前英雄標籤的下部分頁窗格和當選擇標籤時顯示對應於每個標籤的EditViewPanel

從一開始就表現糟糕,但是當我添加上層的英雄標籤(讓多個英雄同時編輯)時,標籤之間的切換變得更慢。 需要幾分鐘以在所有代碼完成添加組件後顯示新JFrame中的內容。這可能是佈局?

我正在使用MigLayout絕對定位。其實,在我添加上面的標籤之前,已經有一些「絕對鏈接值不穩定的循環依賴!」問題,但現在不知何故。

stateChanged()我有什麼達此:

editViewPanel.activateView(currentTab.getLinkedView()); 

而且在activateView()

removeAll(); 
currentView = heroView; 
add(currentView, "pos 0 0"); 
currentView.refresh(); 
revalidate(); 

但就像我說的,所有的代碼執行完畢在合理的時間內,我已經完成了我的分析,但是完成後,會有相當長的延遲,在第一次添加到新的JFrame時長達幾分鐘。

另一個問題是,當我需要更新下面的tabbedpane內的面板時,特別是StatsPanel由幾個列中的每個參數添加的string-int元素組成時,我還有一個很大的延遲。它也取決於MigLayout,由於某種原因(我知道設計不好)也具有絕對定位。但是我已經改變了它,所以在初始化之後沒有組件被移除/添加,只有setText()被使用,並且在代碼完成執行後仍然有很大的延遲。

我打算使用SwingWorkers,但我想在開始解決問題之前更好地理解問題。我懷疑這很簡單,但我對它造成的延遲有多大有點懷疑。我會很感激SwingWorkers的一些提示/例子。

我可以添加更多的代碼,如果你有一些大概的問題可能隱藏的問題。

歡迎任何建議,謝謝!

回答

1

好吧,我終於通過美國東部時間轉儲完成了。由於佈局,凍結,似乎不太可能。 MigLayout試圖在每次選擇新選項卡時找出所有組件的大小,並且可能針對init上所有選項卡中的所有組件。 解決方案是簡單地覆蓋getPreferredSize()JTabbedPanel的實現。 @Robin,感謝您的線程轉儲提示!

3

我從來沒有遇到一個Swing UI,由於可見的JComponent的數量很慢。我經常看到的是一個緩慢的用戶界面,因爲用戶界面線程被用來執行各種與用戶界面更新無關的工作。

在Swing中,只有一個線程可以在其上更新UI,並且該線程負責繪製UI(Event Dispatch Thread)。如果你通過例如阻止該線程對其進行計算,在計算運行時,用戶界面將無法重新繪製或對用戶輸入做出反應。這就是爲什麼你必須執行工作線程所有繁重的工作。這在Concurrency in Swing教程中有明確的解釋。

不是100%確定這是發生在你的情況,但它絕對聽起來像它。如果您想確定,請在您等待用戶界面時進行線程轉儲,並查看當時名爲AWT-EventQueue-0的線程在做什麼。如果確實需要5分鐘才能更新UI,則必須能夠快速找到阻礙UI的內容。

+0

在eclipse調試程序中,如何獲取線程轉儲以及如何分析它?抱歉,找不到有用的東西。 就像我說過的,所有的代碼都在運行,所以我沒有在調試器中看到任何東西。這個線程似乎還沒有做任何事情,但是GUI被凍結了嗎? – 2014-10-20 08:01:56

+0

如果UI被凍結,您可能會發生死鎖或仍在運行。我不使用Eclipse,所以不知道如何獲得線程轉儲。 – Robin 2014-10-20 13:37:55

相關問題