2011-06-19 128 views
5

我有一個小的java桌面應用程序,需要能夠分別點擊「+」和「 - 」按鈕來動態添加和刪除字段。我已經通過調用revalidate(),然後在所有父容器上重繪repaint(),直到ActionListener中的JFrame。Java Swing revalidate()和repaint()問題

這似乎已經成功了,但偶爾它不起作用,並且JPanel不能正確調整大小。這種情況很少發生,看似隨意,並且讓我相信這可能是一個併發問題。我已經嘗試從事件派發線程啓動父容器,但是這並沒有解決問題。

這實際上是一個併發問題還是我吠叫錯誤的樹?任何人都知道發生了什麼以及如何解決?

非常感謝

-SwingNoob

+0

@john,a ['LayoutManager'](http://download.oracle.com/javase/tutorial/uiswing/layout/using.html)負責其組件。據說,當從容器中添加/刪除組件時,絕對沒有理由調用repaint()或revalidate()。 – mre

+1

間歇性錯誤通常會提示併發性問題,但我不認爲任何人都能夠根據所提供的信息爲您提供可靠的答案。 –

+1

@mre:請澄清你的評論,因爲根據我的經驗和閱讀,當添加組件時,需要在Container上調用'revalidate'和'repaint'來移除項目和'revalidate',有時需要'repaint'。 –

回答

1

啓動從AWT/EDT螺紋容器是不夠的。

您需要對AWT/EDT線程上的容器執行每個佈局更改。

所以,如果你確定你的添加和刪除是這樣完成的,那麼就不需要重新驗證()或重繪()。

+2

'AWT'線程?你不是指'EDT'嗎? – mre

+0

我稱它爲awt(自1999年起) – bestsss

3

未回答OP的問題nice example,OP的問題也許是關於佈局管理和OP的代碼一些不明

1 /如果你增加了一個新的JComponent的容器,那麼你必須調用

validate(); 
repaint(); //lay with LayoutManager required that 

2 /如果除去,然後從/到容器增加了一個JComponents那麼你必須調用

revalidate(); 
repaint(); // lay with LayoutManager required that 

3 /貌似爲重新驗證覆蓋VAL也可以,

+0

我不確定是否需要調用'repaint()'。我寫了一些示例代碼,看起來無論是刪除還是添加組件,調用'validate()'都是必需的。但是,當然,這可能完全是情境。:) – mre

+0

@mre同意,如果你將刪除或只添加一個JComponents,如果有JComponents的數量,我認爲你只能用嚴格的MVC GUI的架構冒險,否則不是好主意安全的byteCode一行... :-),是的,對GC重繪很懶,這是未描述的鍊金術 – mKorbel