2009-09-06 137 views
1

我正在努力(!)與Java GUI開發。所有這些顯而易見的小事都不起作用。我會解釋我正在嘗試做什麼以及我失敗的地方(這是非常令人沮喪的):Java的setPreferredSize不會調整大小JPanel

我有這個駐留在面板中的graphics2d對象。現在這個圖形繪製一個圖像,它可以繼續下去,並永遠繪製。這幅圖畫擴大了horrioncally,因爲我不知道期望的大小,我把它放在一個滾動窗格內。現在我想調整每個疼痛迭代中的JPanel大小,並將setPreferredSize設置爲較大的值,從而擴展了滾動窗格的旋鈕。

問題: 從某種原因,當我從paint調用setPreferredSize時,它什麼也不做。我在面板上叫它。當我嘗試從調用paint的函數調用setPreferredSize時,它只執行一次調整大小操作!

這可能是什麼原因?

除此之外,我還有一個小問題,我很想解決: 由於圖形繪製時間不斷增加,我怎樣才能提高scrollpanes的位置?逐漸增加它?

人們,非常感謝。我確實需要幫助在這裏

回答

6

優先停留大小,它的名字,不是強制性的...也許包()或重新驗證()將幫助...

+0

哇,重新驗證真的有竅門:哦,謝謝你'。它就像在乾草堆裏尋找針。你知道如何推進滾動條嗎? – vondip 2009-09-06 20:16:27

+0

你爲什麼要問這個話題的多重問題。你在其他帖子中已經獲得了激怒,但你永遠不打算將這些問題標記爲已接受。當然,你不應該從paintComponent()方法調用setPreferredSize。而且你也不應該使用該方法調用revalidate。你會把所有的問題放在一起,然後每個人都會知道已經建議了什麼,我們不會浪費時間提出相同的建議。將來會在您的問題中發佈SSCCE。如果你不知道SSCCE是什麼,那麼搜索網頁。 – camickr 2009-09-06 21:55:47

+0

@unknown:嘗試在單獨的線程中滾動元素,也許你有其中的場景設置它,而仍然驗證過程沒有完成,並且該過程設置滾動回到0.不知道這會有所幫助.. – 2009-09-07 07:33:18

2

聽起來像你有一些事情錯了。

  • 設置paint方法內的任何尺寸屬性(actuallly任何在所有組件的屬性)將導致可能奇怪的行爲,因爲你真的不知道何時以及如何往往油漆被稱爲

  • 你通常不會畫你自己。一旦組件變得可見,它就會被Swing調用

  • 如果我知道了它的話,你想要一個Component,它隨着時間的推移而增長。恕我直言,正確的做法是創建一個計時器。使用計時器根據需要更改尺寸。在繪製方法中,只需閱讀這些信息並使用它來決定要繪製什麼。

+0

好吧,我已經有一個定時器,每隔一段時間調用一次repaint方法。我嘗試設置組件的大小,我注意到這個奇怪的事情:當滾動條移動到遠端時(就像我要向前滾動一樣),JPanel突然調整大小。任何想法爲什麼?我怎樣才能讓滾動窗格自行前進? – vondip 2009-09-06 20:08:27

+0

聽起來像需要通知上游組件(JScrollpane)有關更改。如果我說得對,invalidate()是正確的做法,但我不完全確定 – 2009-09-07 07:23:26

1

了setPreferredSize是許多線索之一,你可以給它的LayoutManager如果確實已經設置了LayoutManager,則管理組件容器的佈局。這取決於給定的佈局管理器對於這些提示的作用。

我建議你查閱書Filthy Rich Clients,以深入瞭解Swing組件渲染的工作原理。

1

你應該注意到set(Preferred/Minimal/Maximum)Size()只不過是提示父組件和它的layoutmanager組件應該得到多少空間。 此外請注意,這些尺寸只能在組件佈局時解釋(首次渲染,無效()等)。