2012-05-05 28 views
1

我知道,沒有代碼這可能很難回答,但問題是我不知道要發佈什麼代碼。我的問題是,當我加載一個XML文件時,對它進行解組,然後迭代一個ArrayList的值,以重新填充放置在JScrollPane內的JPanel上的JLabel數組,直到整個處理完成後纔會更新圖形。當我創建一個使用JProgressBar打開的JFrame時,我發現了這一點。直到一切完成,酒吧甚至不顯示或畫在窗格上。這打破了目的,因爲我試圖讓進度條顯示解碼的進度。在調試時,我發現如果我隔離代碼(除了實際加載文件和進行解組),該工作條就可以工作。這讓我看起來,我注意到,提到的其他組件並沒有更新,當單個JLabel被添加和大小,直到所有過程完成,儘管不斷重繪。由於我對JAVA仍然陌生,因此我想我會問是否有人可能知道在這個循環正在進行時所有這些組件都不會圖形更新的原因。我的Swing組件圖形不更新

作爲一個說明,在循環中,我調用add和repaint函數將新解碼的JLabel放置在窗格上,但直到完全像條形圖一樣完成後才顯示。並且所有這些都運行單線程(除了JProgressBar被旋入它自己的線程)。

我可以發佈代碼,如果你喜歡,請直接指向我想要的代碼(IE XML解碼器和循環,JLabel的添加和大小,實例化等)。

回答

2

你的問題是你正在做Swing事件線程或EDT上的所有處理。解決方案是使用後臺線程,例如可以通過SwingWorker對象獲取。

欲瞭解更多信息,請查看名爲Concurrency in Swing的Java Swing教程。它將描述事件線程,爲什麼重要的是要尊重而不是阻止,以及如何使用SwingWorker對象進行後臺處理。

2

您正在「事件派發」線程上工作,該線程與用於運行swing的線程相同。 你需要在一個單獨的線程中完成你的工作。 Take a look at the SwingWorker class

+0

好的,我有我的JProgressBar實現這個概念(代碼在http://stackoverflow.com/questions/10450571/how-can-i-make-a-progress-bar-class-thats-value-can-從呼叫更新到底部),我的問題是這是什麼?我在類中猜測「在窗格上添加」JLabel,或者它會在我實例化JPanel的地方。再次,我是新的,學習和欣賞的幫助。 –

+0

@JesterHawk我會給您的原始問題添加一個示例,可能有用。 –