Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1450697
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

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 可 以 取 四 种 不 同 的 值 , 它 们 分 别 代 表 了 四 种 不 同 的 剩 余空 间 处 理 方 式 :

  • GridBagConstraints.NONE
        不 必 理 睬 剩 余 空 间 的 存 在 , 让 它 空 着好 了 。
  • GridBagConstraints.BOTH
        不 让 一 点 剩 余 空 间 存 在 , 改 变 组 件 的大 小 , 让 它 填 满 分 配 给 它 的 整 个 空 间 。
  • GridBagConstraints.HORIZONTAL
        调 整 组 件 的 大 小 , 把 水 平 方 向 的 空 间填 满 。
  • GridBagConstraints.VERTICAL
        调 整 组 件 的 大 小 , 把 垂 直 方 向 的 空 间填 满 , 让 水 平 方 向 的 空 间 空 着 吧 。
2. gbc.gridwidth = 1; 和 gbc.gridheight = 1;

这 两句 话 像 是 一 对 孪 生 兄 弟 , 应 该 同 时 给 以 同 样 的 重 视 。 它们 一 个 负 责 组 件 的 水 平 宽 度 ( 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 的 多 平 台 之 梦 。

        小 结

  • 学 会 使 用 各 种 各 样 的 外 观 管 理 器 会 带 来 事 半功 倍 的 编 程 效 果 。
  • 这 一 章 里 新 学 习 的 类 有 :
  • BorderLayout , CardLayout , FlowLayout , GridLayot , ridBagLayout , GridBagConstraints 和 Insets 。
  • 类 GridBagLayout 生 成 的 外 观 管 理 器 是 最 具 有 灵 活性 的 外 观 管 理 器 。
  • 类 GridBagLayout 需 要 通 过 类 GridBagconstraints 来 实现 对 程 序 窗 口 外 观 的 管 理 。

下载本文示例代码


第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout第八讲 外观管理器之gridbaglayout

阅读(203) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~