2010-11-22 51 views
6

我有三個Janel畫在JFrame上。這些目前都設置爲使用默認的FlowLayout。我希望這些在單列中是一個在另一個之上。Java Swing:FlowLayout JPanels坐在一起嗎?

但是,我發現它們在同一行上彼此相鄰,只要它們中的組件相同即可。

FlowLayout JPanel的自然寬度是其內容的總和嗎?如果是這樣,有沒有辦法強制該區域的寬度爲JFrame的寬度?有趣的是,我發現如果「頂部」和「底部」面板的內容跨越了JFrame的整個寬度,並且「中間」面板留空,那麼「中間」面板會創建一個兩者之間的空間,很像老「

的HTML。

感謝,

回答

1

可以使用GridLayout的組件來創建YxZ電網。爲了佈局更加精確,您可以使用構造GridBagLayout它提供了對po的完全控制爲嵌套組件分區和調整大小。

0

我總是跟NetBeans一起去。因爲,我可以將Free Design設置爲無需將組件放置在JPanel或JFrame上:)您可以考慮它。

2

如果你想創建一個垂直佈局,你可能想使用BoxLayout來查看封閉的容器。這可以設置爲沿y軸佈局組件。

4

正如Jim所說,如果您需要線性對齊組件,BoxLayout是正確的選擇。

下面是一個例子:

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

/** 
* 
* @author nicholasdunn 
*/ 
public class BoxLayoutExample extends JPanel { 

    public BoxLayoutExample() { 
     JPanel topPanel = new JPanel(); 
     JPanel middlePanel = new JPanel(); 
     JPanel bottomPanel = new JPanel(); 

     topPanel.setBorder(BorderFactory.createEtchedBorder()); 
     middlePanel.setBorder(BorderFactory.createEtchedBorder()); 
     bottomPanel.setBorder(BorderFactory.createEtchedBorder()); 

     topPanel.add(new JLabel("Top")); 
     middlePanel.add(new JLabel("Middle")); 
     bottomPanel.add(new JLabel("Bottom")); 

     BoxLayout boxLayout = new BoxLayout(this, BoxLayout.PAGE_AXIS); 
     setLayout(boxLayout); 
     add(topPanel); 
     add(middlePanel); 
     add(bottomPanel); 

    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(""); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new BoxLayoutExample(); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

alt text

你會做得很好,真正通過introduction to layout managers閱讀理解一組基本的佈局管理的。當需要做複雜的佈局時,請使用MigLayout而不是試圖學習GridBagLayout - 你會感謝我。