原文 http://blog.csdn.net/wguoyong/article/details/6898149
它將組件按層次分組,以決定它們在 Container
中的位置。GroupLayout
主要供產生器使用,但也可以手工編碼。分組由 Group
類的執行個體來完成。GroupLayout
支援兩種組。串列組
(sequential group) 按順序一個接一個地放置其子項目。並行組 (parallel group) 能夠以四種方式對齊其子項目。
每個組可以包含任意數量的元素,其中元素有 Group
、Component
或間隙 (gap)。間隙可被視為一個具有最小大小、首選大小和最大大小的不可見組件。此外,GroupLayout
還支援其值取自 LayoutStyle
的首選間隙。
元素類似於一個彈簧。每個元素都有一個範圍,由最小大小、首選大小和最大大小指定。間隙的範圍由開發人員指定,或者由 LayoutStyle
確定。Component
的範圍通過 Component
的 getMinimumSize
、getPreferredSize
和getMaximumSize
方法確定。此外,添加 Component
時,可以指定使用一個特定範圍,而不使用該組件的範圍。Group
的範圍由組的類型確定。ParallelGroup
的範圍是其元素範圍的最大值。SequentialGroup
的範圍是其元素範圍的總和。
GroupLayout
將每個軸 (axis) 單獨對待。也就是說,存在一個表示水平軸的組和一個表示垂直軸的組。水平組負責確定沿水平軸的最小大小、首選大小和最大大小,並設定所包含組件的 x 和寬度。垂直組負責確定沿垂直軸的最小大小、首選大小和最大大小,並設定所包含組件的 y 和高度。每個 Component
都必須同時存在於水平組和垂直組中,否則,在版面配置階段中或者在請求最小大小、首選大小或最大大小時,將拋出 IllegalStateException
。
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();
}
}