????? Java SE 6 中包含一個新的 GroupLayout ,從GroupLayout的單詞意思來看,它是以Group(組)為單位來管理布局,也就是把多個組件(如:JLable、JButton)按區域劃分到不同的Group(組),再根據各個Group(組)相對于水平軸(Horizontal)和垂直軸(Vertical)的排列方式來管理。下面我們針對這樣一個界面看看它的用法:

首先劃分組:
1、按水平(Horizontal)方向劃分:

hpg1? : JLabel 所在組(只有一個組件可以不用分組)
hpg2a : 左邊兩個JCheckBox平行于水平軸(Horizontal)排列,構成一個ParallelGroup
hpg2b : 右邊兩個JChecKBox平行于水平軸(Horizontal)排列,構成一個ParallelGroup
hpg2H : hpg2a 和 hpg2b 兩個組沿著水平軸(Horizontal)順序排列,構成一個SequentialGroup
hpg2? :? JTextBox和組hpg2H 平行于水平軸(Horizontal)排列,構成一個ParallelGroup
hpg3? :? 兩個JTextBox平行于水平軸(Horizontal)排列,構成一個ParallelGroup
另外JLabel 、hpg2、hpg3 沿著水平軸(Horizontal)順序排列,構成一個SequentialGroup
2、按垂直(Vertical)方向劃分:

vpg1 : JLabel、JTextBox 、JButton(Find)平行于垂直軸(Vertical)排列,構成一個ParallelGroup
vpg2 : 上邊兩個JChecKBox、JButton(Cancel)平行于垂直軸(Vertical)排列,構成一個ParallelGroup
vpg3 : 下邊兩個JChecKBox平行于垂直軸(Vertical)排列,構成一個ParallelGroup
另外vpg1、vpg2、vpg3 三個組沿著垂直軸(Vertical)順序排列,構成一個SequentialGroup
3、編碼:水平和垂直兩個方向我們都必須設定,實現方法詳見程序。
addComponent:向Group里添加組件,如JLabel、JTextBox
addGroup??? : 向Group里添加組
/// GLayout.java
package lee;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GLayout extends JFrame
{
?? public GLayout()
?? {
??? super("Find");
??? setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
??? //String laf = UIManager.getCrossPlatformLookAndFeelClassName();
??? String laf = UIManager.getSystemLookAndFeelClassName();
??? try {
??? ???? UIManager.setLookAndFeel(laf);
??? } catch (UnsupportedLookAndFeelException exc) {
???? System.err.println("Warning: UnsupportedLookAndFeel: " + laf);
??? } catch (Exception exc) {
???? System.err.println("Error loading " + laf + ": " + exc);
??? }
??? JLabel label1 = new JLabel("Find What:");
??? JTextField textField1 = new JTextField();
??? JCheckBox caseCheckBox = new JCheckBox("Match Case");
??? JCheckBox wholeCheckBox = new JCheckBox("Whole Words");
??? JCheckBox wrapCheckBox = new JCheckBox("Warp Around");
??? JCheckBox backCheckBox = new JCheckBox("Search Backwards");
??? JButton findButton = new JButton("Find");
??? JButton cancelButton = new JButton("Cancel");
???
??? Container c = getContentPane();
??? GroupLayout layout = new GroupLayout(c);
??? c.setLayout(layout);
???
??? //自動設定組件、組之間的間隙
??? layout.setAutoCreateGaps(true);
??? layout.setAutoCreateContainerGaps(true);
??//LEADING -- 左對齊??? BASELINE -- 底部對齊? CENTER -- 中心對齊
??? GroupLayout.ParallelGroup hpg2a = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
??? hpg2a.addComponent(caseCheckBox);
??? hpg2a.addComponent(wholeCheckBox);
????
??? GroupLayout.ParallelGroup hpg2b = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
??? hpg2b.addComponent(wrapCheckBox);
??? hpg2b.addComponent(backCheckBox);
??? GroupLayout.SequentialGroup hpg2H = layout.createSequentialGroup();
??? hpg2H.addGroup(hpg2a).addGroup(hpg2b);
??
??? GroupLayout.ParallelGroup hpg2 = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
??? hpg2.addComponent(textField1);
??? hpg2.addGroup(hpg2H);
??
??? GroupLayout.ParallelGroup hpg3 = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
??? hpg3.addComponent(findButton);
??? hpg3.addComponent(cancelButton);
??//水平
??? layout.setHorizontalGroup(layout.createSequentialGroup()
??????? .addComponent(label1).addGroup(hpg2).addGroup(hpg3));???
???
??? //設定兩個Button在水平方向一樣寬
??? layout.linkSize(SwingConstants.HORIZONTAL,new Component[] { findButton, cancelButton });
??? //layout.linkSize(SwingConstants.HORIZONTAL,new Component[] { caseCheckBox, wholeCheckBox, wrapCheckBox, backCheckBox});
??? GroupLayout.ParallelGroup vpg1 = layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
??? vpg1.addComponent(label1);
??? vpg1.addComponent(textField1);
??? vpg1.addComponent(findButton);
???
??? GroupLayout.ParallelGroup vpg2 = layout.createParallelGroup(GroupLayout.Alignment.CENTER);
??? vpg2.addComponent(caseCheckBox);
??? vpg2.addComponent(wrapCheckBox);
??? vpg2.addComponent(cancelButton);
??? GroupLayout.ParallelGroup vpg3 = layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
??? vpg3.addComponent(wholeCheckBox);
??? vpg3.addComponent(backCheckBox);
??//垂直
?? layout.setVerticalGroup(layout.createSequentialGroup()
?? ???? .addGroup(vpg1).addGroup(vpg2).addGroup(vpg3));
?? ?
??? setLocation(200,200);
??? pack();
??? setVisible(true);
? }
? public static void main(String[] args)
?{
??new GLayout();
?}
}
4、這里有一個英文參考 ( 注意:其代碼在Java SE 6.0正式版不能用)