2008年(3500)
分类:
2008-05-04 19:14:27
教 学 纲 要
讲 外观 管 理 器 如 果 不 讲 GridBagLayout 外 观 管 理 器 就 好 像 讲 《 岳飞 传 》 不 讲 岳 母 刺 字 一 样 , 最 精 彩 的 部 分 没 有 讲 。虽 说 GridBagLayout 和 GridLayout 只 有 一 点 差 别 , 它 的 作 用 却 是 出 奇的 大 。
类 GridBagLayout
讲 外观 管 理 器 如 果 不 讲 GridBagLayout 外 观 管 理 器 就 好 像 讲 《 岳飞 传 》 不 讲 岳 母 刺 字 一 样 , 最 精 彩 的 部 分 没 有 讲 。
虽 说 GridBagLayout 和 GridLayout 只 有 一 点 差 别 , 它 的 作 用 却 是 出 奇的 大 。 这 是 因 为 GridBagLayout 一 改 其 他 的 外 观 管 理 器 的 死板 模 样 , 具 有 很 多 的 灵 活 性 。 它 不 再 像 其 他 的 外 观 管 理器 那 样 , 使 得 各 个 组 件 的 大 小 都 一 样 。 GridBagLayout 通 过类 GridBagConstraints 的 帮 助 , 按 照 设 计 的 意 图 , 改 变 组 件 的大 小 , 把 它 们 摆 在 设 计 者 希 望 摆 放 的 位 置 上 。
在 GridBagLayout 中 , 每 个 组 件 都 有 一 个 GridBagConstraints 对 象 来 给 出 它 的 大小 和 摆 放 位 置 。 我 们 在 使 用 GridBagLayout 的 时 候 , 最 重 要的 就 是 学 会 使 用 这 个 类 GridBagConstraints 的 使 用 方 法 , 学 会如 何 设 置 组 件 的 大 小 、 位 置 等 限 制 条 件 。
我 们先 看 一 个 用 GridBagLayout 外 观 管 理 器 生 成 的 窗 口
( 图 14.8 ):
图 14.8 程 序 14.5 的 执 行 结 果
这 个窗 口 里 面 的 几 个 按 钮 有 的 大 、 有 的 小 , 其 大 小 、 位
置 均不 同 , 没 有 一 定 的 规 律 可 循 , 这 即 是 发 挥 了 GridBagLayout 外 观 管 理 器
的 灵 活 性 。 生 成 此 窗 口 的 程 序 为 :
程 序 14.5
import java.awt.*;
// 输 入 所 有 的 java.awt 类
public class window7 extends java.applet.Applet
{
public void init( ) {
resize(300,100); // 设 置 窗 口 的 大 小
GridBagConstraints gbc = new GridBagConstraints(
); // 使 用 类 GridBagConstriants
setLayout(new GridBagLayout()); //设 定 外观
管 理 器 为 GridBagLayout 外 观 管 理 器
gbc.fill = GridBagConstraints.BOTH; // ★
所 有 的 按 钮 都 会 把 分 配 的 剩 余 空 间 填 满
gbc.gridwidth = 1; // ★ 设 置 第 一 个 按钮 的 大
小
gbc.gridheight = 1; // ★
Button Button1 = new Button(" 东 ");
((GridBagLayout)getLayout( )).setConstraints(Button1,gbc);
add(Button1);
gbc.gridwidth = GridBagConstraints.REMAINDER;
// ★ 第 二 个 按 钮 填 满 整 行 空 间
Button Button2 = new Button(" 西 ");
((GridBagLayout)getLayout( )).setConstraints(Button2,gbc);
add(Button2);
gbc.gridheight = 4; // 设 置 第 三 个 按钮 的 大
小
gbc.gridwidth = 1;
Button Button3 = new Button(" 南 ");
((GridBagLayout)getLayout( )).setConstraints(Button3,gbc);
add(Button3);
gbc.gridheight = 2; // 设 置 第 四 个 按钮 的 大
小
gbc.gridwidth = 2; // GridBagConstraints.REMAINDER;
Button Button4 = new Button(" 北 ");
((GridBagLayout)getLayout( )).setConstraints(Button4,gbc);
add(Button4);
gbc.gridwidth = GridBagConstraints.REMAINDER;
Button Button5 = new Button(" 中 ");
((GridBagLayout)getLayout( )).setConstraints(Button5,gbc);
add(Button5);
gbc.insets = new Insets(5,6,7,8); // ★ 设置
第 五 个 按 钮 的 位 置
Button Button6 = new Button(" 好 酒 在
张弓 ");
((GridBagLayout)getLayout( )).setConstraints(Button6,gbc);
add(Button6);
}
}
★ 注 释 : 程 序 14.5 里 面 有 星 号 的 语 句都 将 做 详 细 的
解 释
下 面就 详 细 地 解 释 一 下 程 序 14.5 , 通 过 对 这 个 小 程 序 的 分 析可 以 从 中 了 解 GridBagLayout 外 观 管 理 器 的 工 作 原 理 和 工 作方 法 。
GridBagLayout 外 观 管 理 器 实 际 上 是 根 据 类 GridBagConstraints 所 给 出 的 条 件 限 制 以 及 组 件 本 身 的 一 向 特 性 条 件 ( 例 如每 个 组 件 程 序 允 许 的 最 小 尺 寸 ) , 来 决 定 各 个 组 件 的 外观 的 。
让 我们 把 程 序 14.5 之 中 出 现 的 新 鲜 的 语 句 一 条 一 条 地 看 个 明白 吧 :
1. gbc.fill = GridBagConstraints.BOTH;
每 个组 件 有 一 定 的 原 始 大 小 , 例 如 在 类 FlowLayout 外 观 管 理 器的 管 理 之 下 显 示 的 就 都 是 组 件 的 本 身 原 始 大 小 。 如 果 我们 分 配 给 一 个 组 件 的 空 间 比 它 原 本 所 需 要 的 空 间 大 时 ,就 需 要 一 定 的 方 式 方 法 来 决 定 如 何 处 理 这 一 部 分 多 余 的空 间 。 这 时 就 用 到 了 fill 值 。 Java 根 据 人 们 给 这 个 fill 设定 的 值 来 决 定 如 何 处 理 比 组 件 原 始 空 间 大 的 那 部 分 空 间。
fill 可 以 取 四 种 不 同 的 值 , 它 们 分 别 代 表 了 四 种 不 同 的 剩 余空 间 处 理 方 式 :
这 两句 话 像 是 一 对 孪 生 兄 弟 , 应 该 同 时 给 以 同 样 的 重 视 。 它们 一 个 负 责 组 件 的 水 平 宽 度 ( gridwidth ) , 一 个 负 责 组 件的 垂 直 高 度 ( gridheight ) 。 由 此 我 们 可 以 知 道 , 组 件 的大 小 是 可 以 变 化 的 。
组 件 的 形 状 是 不 能 改 变 的 , 永 远 是 矩 形 的 。
好 了 , 这 两 条 语 句 的 意 义 很 简 单 , 就 讲 到 这 里 吧 。
喂 ! 等 一 等 , 我 看 到 下 面 有 一 条 语 句是 :
gbc.gridwidth = GridBagConstraints.REMAINDER;
src="/images/blank.gif" width="30"
height="1" border="0"> 这 是 什 么 意 思 ?
怎 么 gridwidth 的 值 不 是 一 个 数 , 而 是 “ GridBagConstraints.REMAINDER ” ?
原 来, 这 是 Java 精 心 为 大 家 设 计 的 一 个 特 别 有 用 的 变 量 , 使用 它 就 可 以 通 知 外 观 管 理 器 让 组 件 占 据 本 行 的 所 有 剩 余空 间 , 而 不 必 去 计 算 宽 度 值 是 多 少 , 很 自 动 化 。
3. gbc.insets = new Insets(5,6,7,8);
这 条语 句 里 面 提 到 了 两 个 拼 写 几 乎 完 全 相 同 的 词 : insets 和 Insets , 虽 然 只 相 差 一 个 字 母 : 一 个 是 大 写 I , 一 个 是 小 写 i ,但 是 它 们 代 表 的 意 义 可 大 不 相 同 。
Insets 是 AWT 里 面 一 个 类 的 名 字 , 代 表 着 类 Insets , 它 的 用 途 是用 来 定 义 组 件 容 器 周 围 的 空 间 大 小 , 其 中 带 有 四 个 参 数:
Insets( 第 一 个 参 数 , 第 二 个 参 数 , 第 三 个 参 数 , 第 四 个 参 数 )
第 一个 参 数 代 表 距 上 面 有 几 个 点 的 空 白 , 第 二 个 参 数 代
表 距左 边 有 几 个 点 的 空 白 , 第 三 个 参 数 代 表 距 下 边 有 几 个 点的 空 白 区 域 , 第
四 个 参 数 代 表 距 右 边 留 几 个 点 的 空 白 区域 。
形 象 一 点 的 表 示 如 图 14.9 :
图 14.9 参 数 的 设 定 顺 序
insets 是 类 GridBagConstraints 的 一 个 限 定 条 件 。
insets 和 Insets 既 然 起 的 名 字 相 同 , 两 者 之 间 也 一 定 有 相 同 之 处, 它 们 的 相 似 之 处 就 在 于 它 们 的 用 法 和 用 途 。 insets 用 来设 置 一 个 组 件 和 其 他 的 组 件 之 间 的 距 离 的 。 所 以 在 上 面程 序 里 的 按 钮 和 其 他 的 按 钮 不 同 , 它 和 其 他 的 按 钮 之 间都 有 一 定 的 距 离 , 而 不 是 和 其 他 的 按 钮 挨 在 一 起 。
总 之, 使 用 外 观 管 理 器 给 我 们 带 来 了 许 多 的 方 便 之 处 , 使 得我 们 可 以 轻 轻 松 松 地 完 成 各 种 窗 口 的 外 观 处 理 工 作 。
使 用 外 观 管 理 器 除 了 使 得 程 序 设 计 变 得 方 便 以 外 , 还 使得 程 序 变 得 容 易 在 各 种 不 同 的 窗 口 环 境 下 运 行 , 从 而 协助 实 现 了 Java 的 多 平 台 之 梦 。
小 结
下载本文示例代码