2011-05-19 84 views
2

我試圖與一個JFrame(實際上,在Scala的Swing包裝,Frame,但我不明白爲什麼這應該很重要),其中包含BoxLayout其中有幾個項目,其中一個響應按鈕更改大小點擊(BoxLayout中的另一項)。當孩子調整大小時調整JFrame的大小:如何跟上?

當調整大小,該按鈕事件處理程序執行以下操作:

  1. 呼叫上改變大小的項目(JPanel)的方法;這爲該組件調用setPreferredSize
  2. 呼叫packJFrame
  3. 呼叫repaintJFrame

這適用於一個很奇怪的警告:JFrame中總是落後一步。因此,如果我將我的首選x尺寸設置爲100,200,300,200,100,則JFrame的寬度將爲100,100,200,300,200。

可能會出錯,以及如何獲取尺寸更改傳播到JFrame窗口大小,當他們應該?

(更多可能,但希望不是相關的細節:Ubuntu的10.10使用Sun Java 1.6.0_24)

回答

4

當您更改組件的大小我會嘗試重新驗證()父容器,佈局管理器可以再次被調用,這將重新正確地重新計算所有大小。

如果您需要更多幫助,請發佈您的SSCCE來證明問題。首先嚐試使用JFrame,如果仍存在問題,您將知道標準的JDK類或Scala是否會導致此問題。

+0

這樣做 - 在'BoxLayout'_上重新驗證_,而不是'JFrame'上的validate/invalidate的任何組合。謝謝! – 2011-05-19 13:46:28

1

我同意camickr說revalidate()必須用來代替pack()。要解決「落後一步」,請撥打SwingUtilities.invokeLater(),撥打revalidate()repaint()

相關問題