JAVA 6.0中新特性GroupLayout

转自:  http://www.blogjava.net/esls2008/archive/2006/12/18/88548.html

 

它将组件按层次分组,以决定它们在 Container 中的位置。GroupLayout 主要供生成器使用,但也可以手工编码。分组由 Group 类的实例来完成。GroupLayout 支持两种组。串行组 (sequential group) 按顺序一个接一个地放置其子元素。并行组 (parallel group) 能够以四种方式对齐其子元素。

每个组可以包含任意数量的元素,其中元素有 GroupComponent 或间隙 (gap)。间隙可被视为一个具有最小大小、首选大小和最大大小的不可见组件。此外,GroupLayout 还支持其值取自 LayoutStyle 的首选间隙。

元素类似于一个弹簧。每个元素都有一个范围,由最小大小、首选大小和最大大小指定。间隙的范围由开发人员指定,或者由 LayoutStyle 确定。Component 的范围通过 Component 的 getMinimumSizegetPreferredSize 和getMaximumSize 方法确定。此外,添加 Component 时,可以指定使用一个特定范围,而不使用该组件的范围。Group 的范围由组的类型确定。ParallelGroup 的范围是其元素范围的最大值。SequentialGroup 的范围是其元素范围的总和。

GroupLayout 将每个轴 (axis) 单独对待。也就是说,存在一个表示水平轴的组和一个表示垂直轴的组。水平组负责确定沿水平轴的最小大小、首选大小和最大大小,并设置所包含组件的 x 和宽度。垂直组负责确定沿垂直轴的最小大小、首选大小和最大大小,并设置所包含组件的 y 和高度。每个 Component 都必须同时存在于水平组和垂直组中,否则,在布局过程中或者在请求最小大小、首选大小或最大大小时,将抛出 IllegalStateException

 

Java SE 6 中包含一个新的 GroupLayout ,从GroupLayout的单词意思来看,它是以Group(组)为单位来管理布局,也就是把多个组件(如:JLable、JButton)按区域划分到不同的Group(组),再根据各个Group(组)相对于水平轴(Horizontal)和垂直轴(Vertical)的排列方式来管理。下面我们针对这样一个界面看看它的用法:
JAVA 6.0中新特性GroupLayout_第1张图片

首先划分组:

1、按水平(Horizontal)方向划分:
JAVA 6.0中新特性GroupLayout_第2张图片
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)方向划分:

JAVA 6.0中新特性GroupLayout_第3张图片
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里添加组

package com.test;

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();
	}
}


 

你可能感兴趣的:(java,exception,String,layout,import,parallel)