2010-09-06 137 views
7

我對Java的佈局管理器有個討厭的問題。我有以下情況:在面板A是兩個其他面板B與絕對佈局和C與FlowLayout。 B高度定製,並通過setPreferredSize設置固定大小。 C應該具有相同的固定寬度爲B但其他方面的高度可變,具體取決於流中添加了多少組件。由此產生的A應該具有固定寬度並且A.height + B.height作爲高度 - 至少這是我想要的。JPanel中的固定寬度,可變高度,流量爲

但是我所得到的是,面板不固定在所有(即使我設置其優選的大小),並且在面板內容Ç寬度不會自動包裝而是被顯示在排長隊。當然這也使得B具有比它應該更大的寬度。

我能做些什麼來解決這個問題?有沒有更好的佈局,還是我必須使用絕對佈局來模擬全部?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JPanel; 

public class Test extends JPanel 
{ 
    public Test() 
    { 
     this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 

     JPanel top = new JPanel(null); 
     top.setBackground(Color.GREEN); 
     top.setPreferredSize(new Dimension(200, 20)); 
     JPanel flowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2)); 

     this.add(top); 
     this.add(flowPanel); 

     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
     flowPanel.add(new JButton("x")); 
    } 
} 

回答

9

Wrap Layout應該有所幫助。你把一個BorderLayout的的LINE_END或LINE_START部分將保持其寬度不變

+0

這實際上工作得很好!如果沒有人提出本地解決方案,這就是我將要使用的。謝謝!太糟糕了,標準佈局經理在這樣的常見情況下(至少對我來說)總是失敗,而且你總是會得到一個新的自定義的..:/ – poke 2010-09-06 16:10:05

+0

@poke:對我來說,這代表了一種選擇偏見 - 我傾向於忘記標準佈局通常只是工作! 'WrapLayout'也是編寫自己的經理的好例子。 – trashgod 2010-09-06 16:33:44

0

提供你想要的那種先進的視圖配置的最佳方式是通過強大的GridBagLayoutManager更換你FlowLayout。值得注意的是,當使用流利的子類時,通常由GridBagConstraints表示的約束更容易理解,如GBC

最後,像往常一樣,你應該考慮看看Swing tutorial

+0

嗯,感謝您的鏈接(尤其是GBC ^^),但我不知道如何重現FlowLayout給我的GridBagLayout效果。我實際上想要將這些組件(這裏是:按鈕)包裝到下一行,由於父級JPanel的固定寬度而沒有足夠的空間。 – poke 2010-09-06 16:01:26

0
  1. 您不應該直接將孩子添加到框架。隨時添加到contentPane - >this.getContentPage().add(...)

  2. 爲了使您的佈局工作,在內容頁面放一個JPanel一個GridBagLayout,使該面板填充內容頁面。

  3. 給出GridBagLayout 2列。

現在您不能禁用窗口的水平調整大小,因此您必須找到處理額外空間的不同方法。我建議給第一列固定寬度(設置fill=NONE),並讓面板C填充剩餘空間。

如果將面板B的所有尺寸(最小,最大,首選)設置爲首選尺寸,則不應再更改尺寸。

提示:如果Swing佈局不起作用,請將其嵌套在另一個佈局中。

+1

關於第1點:「爲了方便起見,必須重寫'add'及其變體,'remove'和'setLayout'已被覆蓋以轉發到'contentPane'」。 http://download.oracle.com/javase/6/docs/api/javax/swing/JFrame.html – trashgod 2010-09-06 15:18:29

+0

請注意,我不是在框架/窗口內工作,但我上面的實際類是JPanel本身。它是我的描述中的面板* A *,用於佈局不會改變其大小的不同佈局。 – poke 2010-09-06 15:59:26

+0

@trashgod:自Java 6以來。 – 2010-09-07 10:20:38

0

一切:只有高度將如果調整組件容器大小

南北的寬度可變

中心是寬度&高度調整可變

LINE_START & LINE_END只有高度可變

所以,我建議你把你的「C」集裝箱在這種BorderL的ayout區域