它將組件按層次分組,以決定它們在 Container 中的位置。GroupLayout 主要供生成器使用,但也可以手工編碼。分組由 Group 類的實(shí)例來完成。GroupLayout 支持兩種組。串行組
(sequential group) 按順序一個(gè)接一個(gè)地放置其子元素。并行組 (parallel group) 能夠以四種方式對(duì)齊其子元素。
每個(gè)組可以包含任意數(shù)量的元素,其中元素有 Group 、Component 或間隙 (gap)。間隙可被視為一個(gè)具有最小大小、首選大小和最大大小的不可見組件。此外,GroupLayout 還支持其值取自 LayoutStyle 的首選間隙。
元素類似于一個(gè)彈簧。每個(gè)元素都有一個(gè)范圍,由最小大小、首選大小和最大大小指定。間隙的范圍由開發(fā)人員指定,或者由 LayoutStyle 確定。Component 的范圍通過 Component 的 getMinimumSize 、getPreferredSize 和getMaximumSize 方法確定。此外,添加 Component 時(shí),可以指定使用一個(gè)特定范圍,而不使用該組件的范圍。Group 的范圍由組的類型確定。ParallelGroup 的范圍是其元素范圍的最大值。SequentialGroup 的范圍是其元素范圍的總和。
GroupLayout 將每個(gè)軸 (axis) 單獨(dú)對(duì)待。也就是說,存在一個(gè)表示水平軸的組和一個(gè)表示垂直軸的組。水平組負(fù)責(zé)確定沿水平軸的最小大小、首選大小和最大大小,并設(shè)置所包含組件的 x 和寬度。垂直組負(fù)責(zé)確定沿垂直軸的最小大小、首選大小和最大大小,并設(shè)置所包含組件的 y 和高度。每個(gè) Component 都必須同時(shí)存在于水平組和垂直組中,否則,在布局過程中或者在請(qǐng)求最小大小、首選大小或最大大小時(shí),將拋出 IllegalStateException 。
Java SE 6 中包含一個(gè)新的 GroupLayout ,從GroupLayout的單詞意思來看,它是以Group(組)為單位來管理布局,也就是把多個(gè)組件(如:JLable、JButton)按區(qū)域劃分到不同的Group(組),再根據(jù)各個(gè)Group(組)相對(duì)于水平軸(Horizontal)和垂直軸(Vertical)的排列方式來管理。下面我們針對(duì)這樣一個(gè)界面看看它的用法:

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

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

vpg1 : JLabel、JTextBox 、JButton(Find)平行于垂直軸(Vertical)排列,構(gòu)成一個(gè)ParallelGroup
vpg2 : 上邊兩個(gè)JChecKBox、JButton(Cancel)平行于垂直軸(Vertical)排列,構(gòu)成一個(gè)ParallelGroup
vpg3 : 下邊兩個(gè)JChecKBox平行于垂直軸(Vertical)排列,構(gòu)成一個(gè)ParallelGroup
另外vpg1、vpg2、vpg3 三個(gè)組沿著垂直軸(Vertical)順序排列,構(gòu)成一個(gè)SequentialGroup
3、編碼:水平和垂直兩個(gè)方向我們都必須設(shè)定,實(shí)現(xiàn)方法詳見程序。
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);
//自動(dòng)設(shè)定組件、組之間的間隙
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
//LEADING -- 左對(duì)齊 BASELINE -- 底部對(duì)齊 CENTER -- 中心對(duì)齊
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));
//設(shè)定兩個(gè)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();
}
}
|