2011-09-15 165 views
2

我有JFrame動態添加JPanel情況下,以下列方式工作。我只能看到需要手動調整窗口大小的框。JFrame的執行時間增加的JPanel

注:我嘗試使用this.pack();,但這並沒有奏效。

回答

3

在對GUI進行了這樣的結構更改之後,您需要致電revalidate()repaint()

請注意,setSizesetLocation最好由佈局管理器處理。

相關鏈接:

+0

我該如何使用佈局管理器來處理大小和位置? – JMira

+0

這取決於您希望如何將組件放在框架中。如果您希望該框具有位置'x,y',您應該創建自定義佈局管理器,將內容窗格設置爲使用此管理器,並在添加面板時將x和y傳遞給佈局管理器。例如Google for * java自定義佈局管理器*。 – aioobe

1

這個例子顯示add/remove/pack可能會有幫助。

private void addBox(int x, int y){ 
    JPanel panel = new JPanel(); 
    panel.setBackground(Color.RED); 
    add(panel); 
    //If there isn't another JPanel, then this way you'll occupy 
    //the whole JFrame area; by defalut, JFrame has BorderLayout, 
    //and only one JComponent can occupy the central area 
    revalidate(); 
    repaint(); 
} 
+0

你怎麼知道他還沒有完成getContentPane()。setLayout(null)'? – aioobe

+0

@aioobe 1)是的,只有在有setLayout(null)的情況下,2)setSize和setLocation沒有,因爲相當忽略了使用的LayoutManager並且在任何情況下都可以工作 – mKorbel

+0

* ...並且在所有案例* - 嗯,傳遞給'setSize'的值將被任何佈局管理器覆蓋(即只有在組件需要重新佈局之前纔會使用)。也許這就是你想說的;-) – aioobe

2

這些箱子的用途是什麼?

如果他們是純粹的視覺,並且不打算將組件添加到他們,這將是更好地定義一個類Box(或使用Rectangle2D),並繪製或填補他們在paintComponent()時間。

或者,將它們繪製到BufferedImageGraphics對象上,並將圖像添加到JLabel,如here所示。

enter image description here

+0

不錯的黑暗(用煙花)+1 – mKorbel