2010-02-09 22 views
4

我正在使用一個JPanel(裏面有幾個標籤)在圖上添加動態信息。這個面板是動態創建的,在我用它來繪製之前是不可見的。如何根據其內容找出未顯示的JPanel的首選大小?

爲此,我使用了一個BufferedImage,並遵循了與此other question上描述的大致相同的步驟。只要我指定所有尺寸(面板及其組件),它就可以很好地工作。

就像在問題中提到的問題一樣,我怎麼才能確定這個面板的最佳尺寸?如果此面板以常規框架/佈局設置顯示,則會執行相同的操作。

就我而言,我怎樣才能「打包」這種面板,使其尺寸和內容大小設置爲最佳(然後由標籤大小決定)?

回答

2

蘇拉傑和willcodejavaforfood把我的良好的軌道上。

檢查pack()方法實際做了什麼,我發現這主要是將當前大小設置爲由getPreferredSize()返回的大小。

由此看來,我設法讓這樣的解決方案:

// Creating the panel 
JPanel lPanel = new JPanel(); 
//lPanel.setSize(1000, 1000); //default size, not needed anymore 
lPanel.setLayout(new BoxLayout(lPanel, BoxLayout.PAGE_AXIS)); 

//Adding the content 
lPanel.add(new JLabel("Blah")); 
// etc... 

//Adjust the panel to its preferred size 
lPanel.setSize(lPanel.getPreferredSize()); 

//Call the layout method 
//(this will adjust the content components to their correct size and position) 
lPanel.doLayout(); 

這種方法可以正常工作,並調整面板,其內容爲正確的尺寸(和回答我的問題在一個簡單的方法:「如何找到首選大小?getPreferredSize()「)。

但是,它需要將初始大小設置爲足夠大的大小,以便內容適合,否則它們不會放在佈局上。這有點可惜,並不是真的「乾淨」,但我現在無法找到避免這種情況的方法。

編輯:其實,默認大小是沒有必要的,因爲getPreferredSize()返回正確的值,甚至稱doLayout()之前。因此,在調用佈局方法之前,面板可以設置爲適當的大小。

1

直接的答案是致電Window#pack()。這種方法會自動將所有基礎兒童的大小設置爲他們喜歡的大小(當然,這取決於子容器的佈局,例如BorderLayout doesent給出了一個關於優先大小的提示)。

因此,只要您設置了子組件的首選大小(或佈局的最小/最大大小類似於BorderLayout),pack()方法將成爲您所需要的。

[更新]
一種方式是做的就是添加一個HierarchyListener到您的JPanel並檢查HierarchyEvent#DISPLAYABILITY_CHANGED事件。當意識到自己的面板是準備要顯示(和父母可用)這個事件被調用,在這個時刻,你可以這樣做:

SwingUtilities#getWindowAncestor(myPanel).pack();

+0

如果我的面板在窗口中,但此方法不工作,則此方法可行。我動態地創建這個面板,直接繪製它。在我自己使用它之前,它在任何窗口中都不可見。問題更多的是「如何與沒有窗口的* pack()*相同的效果」。 – Gnoupi 2010-02-09 09:45:19

+0

將它放入JFrame和調用包,然後刪除面板的工作?:) – willcodejavaforfood 2010-02-09 09:57:07

+0

@willcodejavaforfood - 我剛剛嘗試過,它確實有效,但是在過程中添加JFrame似乎有些矯枉過正;) – Gnoupi 2010-02-09 10:27:07