发信人: vivian (vivid), 信区: Training
标 题: JAVA语言入门(六)
发信站: 紫 丁 香 (Sun Jan 17 18:23:08 1999), 转信
第 六 章 Java图 形 用 户 接 口
对 一 个 优 秀 的 应 用 程 序 来 说, 良 好 的 图 形 用 户 接 口 是 必 不 可 少 的。 缺 少 良 好 的 图 形 用 户 接
口, 将 会 给 用 户 理 解 和 使 用 应 用 程 序 带 来 很 多 不 便。 很 难 想 象 用 户 为 了 学 会 使 用 一 个 应 用 程
序, 去 记 一 大 堆 命 令。 Java提 供 了 生 成 一 个 良 好 的 图 形 用 户 接 口 所 需 要 的 一 些 基 本 元 件: 面
板(Panel)、 按 钮 (Button)、 标 签(Label)、 画 板(Canvases)、 滚 动 条(Scrollbar)、 列 表 框(List)、
文 本 域(Text Field)、 文 本 区(Text Area)。
6.1 面 板
面 板 提 供 了 建 立 应 用 程 序 的 空 间。 你 可 以 把 图 形 元 件(包 括 其 他 面 板) 放 在 一 个 面 板 上。
Applet类 提 供 了 一 个 基 本 的 面 板。
6.1.1 布 局 管 理
Java提 供 了 几 种 布 局: 顺 序 布 局(Flow Layout)、 边 界 布 局(Border Layout) 和 网 格 布 局 (Grid
Layout)。
6.1.1.1 顺 序 布 局
顺 序 布 局(Flow Layout) 是 最 基 本 的 一 种 布 局, 面 板 的 缺 省 布 局 就 是 顺 序 布 局。 顺 序 布 局 指 的 是
把 图 形 元 件 一 个 接 一 个 地 水 平 地 放 在 面 板 上。 下 面 是 一 个 顺 序 布 局 的 例 子:
import java.awt.*; import java.applet.Applet;
public class myButtons extends Applet { Button button1, button2, button3; public void init() { button1 = new Button("确 定");
button2 = new Button("打 开"); button3 = new Button("关 闭"); add(button1); add(button2); add(button3); } }
该 程 序 生 成 的 布 局 如 下:
图 6.1
6.1.1.2 边 界 布 局
边 界 布 局 包 括 五 个 区: 北 区、 南 区、 东 区、 西 区 和 中 区。 这 几 个 区 在 面 板 上 的 分 布 规 律 是“ 上
北 下 南, 左 西 右 东”。 下 面 是 一 个 边 界 布 局 的 例 子:
import java.awt.*; import java.applet.Applet;
public class buttonDir extends Applet {
Button buttonN, buttonS, buttonW, buttonE, buttonC;
public void init() { setLayout(new BorderLayout()); buttonN = new Button("水"); buttonS = new Button("火"); buttonE = new
Button("木"); buttonW = new Button("金"); buttonC = new Button("土"); add("North", buttonN); add("South", buttonS);
add("East", buttonE); add("West", buttonW); add("Center", buttonC); } }
下 面 是 该 程 序 运 行 的 结 果:
图 6.2
6.1.1.3 网 格 布 局
网 格 布 局 把 面 板 分 成 一 个 个 的 网 格, 你 可 以 给 出 网 格 的 行 数 和 列 数。 下 面 是 一 个 网 格 布 局 的
例 子:
import java.awt.*; import java.applet.Applet;
public class buttonGrid extends Applet { Button button1, button2, button3, button4, button5, button6, button7, button8;
public void init() { setLayout(new GridLayout(4,2)); button1 = new Button("乾"); button2 = new Button("坤"); button3 = new
Button("艮"); button4 = new Button("震"); button5 = new Button("坎"); button6 = new Button("离"); button7 = new Button("巽");
button8 = new Button("兑"); add(button1); add(button2); add(button3); add(button4); add(button5); add(button6); add(button7);
add(button8); } }
下 面 是 该 程 序 运 行 的 结 果:
图 6.3
6.2 按 钮
6.2.1 按 钮 事 件
用 户 点 一 下 按 钮, 就 会 有 一 个 按 钮 事 件 发 生。 你 可 以 通 过 覆 盖 一 个applet的action成 员 函 数 来 捕 捉
按 钮 事 件。
public boolean action (Event e, Object o) { if (e.target instanceof Button) { system.out.println ((string) o); } else {
System.out.println ("Non-button event"); } return true; }
6.2.2 按 钮 类 型
Java提 供 了 标 准 的 按 压 式 按 钮, 同 时 也 提 供 了 选 择 式 按 钮 和 标 记 式 按 钮。
6.2.2.1 选 择 式 按 钮
选 择 式 按 钮 提 供 了 从 几 个 选 项 中 选 一 个 选 项 的 功 能。 下 面 是 从 几 个 市 中 选 一 个 市 的 例 子, 市
名 放 在 选 择 式 按 钮 中:
CityChooser = new Choice();
CityChooser.addItem("北 京"); CityChooser.addItem("上海"); CityChooser.addItem("天 津");
add(CityChooser);
图 6.4
6.2.2.2 标 记 式 按 钮
标 记 式 按 钮 的 状 态 作 为 标 记 框 事 件 的 对 象 参 数 返 回。 下 面 是 一 个 标 记 式 按 钮 的 例 子:
Checkbox fillStyleButton; fillStyleButton = new Checkbox("Solid");
public boolean action(Event e, Object arg) { if (e.target instanceof Checkbox) { System.out.println("Checkbox: " + arg); } return
true; }
图 6.5
6.2.2.3 按 键 式 按 钮
按 键 式 按 钮 是 一 组 按 钮, 用 户 可 以 选 中 其 中 一 个, 同 时 这 一 组 中 的 其 他 按 钮 将 被 关 闭。 下 面
是 一 个 按 键 式 按 钮 的 例 子: public class CheckBox extends Applet { CheckboxGroup cbg;
public void init() { cbg = new CheckboxGroup(); add (new Checkbox("one ", cbg, true)); add (new Checkbox("two ", cbg,false));
add (new Checkbox("three", cbg, false)); } }
图 6.6
6.2.3 自 包 含 按 钮
Java语 言 的 面 向 对 象 特 性 使 我 们 能 够 创 建 完 全 自 包 含 的 按 钮。 在 自 包 含 按 钮 里, 你 可 以 在 扩 展
按 钮 类 里 建 立 事 件 控 制 函 数。 下 面 是 一 个 自 包 含 按 钮 的 例 子:
import java.awt.*; import java.applet.Applet;
class okButton extends Button {
public okButton() { setLabel("Ok"); }
public boolean action(Event e, Object arg) { System.out.println("OKButton"); return true; } }
public class buttontest extends Applet { okButton myOkButton;
public void init() { myOkButton = new okButton(); add(myOkButton); } }
图 6.7
6.3 标 签
标 签 是 一 种 放 到 面 板 上 的 静 止 的 正 文。 下 面 是 一 个 标 签 的 例 子: import java.awt.*; import
java.applet.Applet;
public class label extends Applet {
public void init() { setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); Label label1 = new Label("你 好!"); Label label2
= new Label("另 一 个 标 签"); add(label1); add(label2); } }
下 面 是 运 行 结 果:
图 6.8
6.4 列 表 框
列 表 框 使 用 户 易 于 操 作 大 量 的 选 项。 创 建 列 表 框 的 方 法 和Choice button有 些 相 似。 列 表 框 的 所 有
条 目 都 是 可 见 的, 如 果 选 项 很 多, 超 出 了 列 表 框 可 见 区 的 范 围, 则 列 表 框 的 旁 边 将 会 有 一 个
滚 动 条。 首 先, 创 建 列 表 框: List l = new List(4, false); 这 个 成 员 函 数 创 建 了 一 个 显 示4行 的 列 表 框。
第 二 个 参 数“false"表 示 这 个 列 表 框 是 单 选 的, 如 果 是“true ", 则 表 示 是 多 选 的。 下 面 增 加 列 表 框
的 选 项:
l.addItem("北 京 大 学"); l.addItem("清 华 大 学"); l.addItem("吉 林 大 学"); l.addItem("复 旦 大 学"); l.addItem("南 开 大
学"); l.addItem("天 津 大 学"); l.addItem("南 京 大 学"); add(l);
图 6.9
6.4.1 在 列 表 框 中 进 行 选 择
可 以 用 成 员 函 数getSelectedItem()或getSelectedItems()来 接 收 在 列 表 框 中 被 选 的 选 项。 在 单 选 列 表 框
里,“ 双 击” 一 个 选 项 就 可 以 触 发 一 个 可 被action()成 员 函 数 捕 捉 到 的 事 件。 public boolean action(Event
e, Object arg) { . . . if (e.target instanceof List) { System.out.println("List entry:" + arg); } . . . }
6.4.2 多 选 列 表 框
对 于 多 选 列 表 框, 要 使 你 的 选 择 产 生 作 用, 需 要 使 用 其 他 的 外 部 事 件。 例 如, 你 可 以 使 用 按 钮
事 件:
图 6.10
public boolean action(Event e, Object arg) { . . . if (e.target instanceof Button) { . . . if ("Ok".equals(arg)) { string[] selected ;
selected = l.getSelectedItems( ); for (int I = 0; I< selected.length; I++) { System.out.println(selected[i]); } } } }
6.5 文 本 域
文 本 域 一 般 用 来 让 用 户 输 入 象 姓 名、 信 用 卡 号 这 样 的 信 息, 它 是 一 个 能 够 接 收 用 户 的 键 盘 输
入 的 小 块 区 域。
6.5.1 创 建 文 本 域
在 创 建 文 本 域 时, 有 四 种 类 型 供 你 选 择: 空 的、 空 的 并 且 具 有 指 定 长 度、 带 有 初 始 文 本 内 容 的
和 带 有 初 始 文 本 内 容 并 具 有 指 定 长 度 的。 下 面 是 生 成 这 四 种 文 本 域 的 代 码:
TextField tf1, tf2, tf3, tf4;
// 空 的 文 本 域 tf1 = new TextField() ; // 长 度 为20的 空 的 文 本 域 tf2 = new TextField(20) ; // 带 有 初 始 文 本 内 容
的 文 本 域 tf3 = new TextField("你 好") ; // 带 有 初 始 文 本 内 容 并 具 有 指 定 长 度 的 文 本 域 tf4 = new
TextField("你 好", 30) ; add(tf1) ; add(tf2) ; add(tf3) ; add(tf4) ;
图 6.11
6.5.2 文 本 域 事 件
当 用 户 在 文 本 域 里 敲“ 回 车” 键 时, 就 产 生 了 一 个 文 本 域 事 件。 象 其 他 事 件 一 样, 你 可 以 以 在
成 员 函 数action()中 捕 捉 到 这 个 事 件。
public boolean action(Event e, Object arg) { . . . if (e.target instanceof TextField) { System.out.println("TextField: "+arg); } . . . }
6.6 文 本 区
文 本 区 可 以 显 示 大 段 的 文 本。
6.6.1 创 建 文 本 区
与 文 本 域 类 似, 创 建 文 本 区 时 也 有 四 种 类 型 供 选 择, 但 如 果 指 定 文 本 区 的 大 小, 必 须 同 时 指
定 行 数 和 列 数。
TextArea ta1, ta2; // 一 个 空 的 文 本 区 ta1 = new TextArea();
// 一 个 带 有 初 始 内 容、 大 小 为5 x 40 的 文 本 区 ta2 = new TextArea("你 好!", 5, 40);
可 以 用 成 员 函 数setEditable()来 决 定 用 户 是 否 可 对 文 本 区 的 内 容 进 行 编 辑。
// 使 文 本 区 为 只 读 的 ta2.setEditable(false)
图 6.12
6.6.2 接 收 文 本 区 的 内 容
可 以 用 成 员 函 数getText()来 获 得 文 本 区 的 当 前 内 容。 例 如: System.out.println(ta1.getText()); 文 本 区 本 身
不 产 生 自 己 的 事 件。 但 你 可 以 用 外 部 事 件 来 接 收 文 本 区 的 内 容:
public boolean action(Event e, Object o) { if (e.target instanceof Button) { if ("send".equals(o)) { String textToSend = ta1.getText
(); System.out.println("sending: " + textTosend); mySendFunction(textToSend); } } else { . . . } }
6.7 画 板
画 板 能 够 捕 捉 到 暴 露 事 件、 鼠 标 事 件 和 其 他 类 似 的 事 件。 基 本 的 画 板 类 不 处 理 这 些 事 件, 但
你 可 以 扩 展 它 来 创 建 有 你 所 需 功 能 的 画 板 类。
6.7.1 创 建 画 板
import java.awt.*; import java.applet.Applet;
public class superGUI extends Applet { . . . myCanvas doodle; . . . public void init() { . . . // 建 立 我 们 的 画 板 doodle = new
myCanvas(); doodle.reshape(0, 0, 100, 100); leftPanel.add("Center",doodle); . . . } }
class myCanvas extends Canvas { public void paint(Graphics g) { g.drawRect(0, 0, 99, 99); g.drawString("Canvas", 15, 40); } }
6.7.2 画 板 事 件
你 可 以 覆 盖 一 般 的 事 件 处 理 成 员 函 数。 下 面 是 一 个 包 含 了mouseDown事 件 处 理 的 例 子:
import java.awt.*; import java.applet.Applet;
public class canvas extends Applet {
Button b1;
public void init() { // Set our layout as a Border style setLayout(new BorderLayout(15, 15)); b1 = new Button("Test"); myCanvas
c1 = new myCanvas(100, 100); // add the canvas and the button to the applet add("Center", c1); add("South", b1); }
public boolean action(Event e, Object arg) { System.out.println("Event: " + arg); return true; }
public boolean mouseDown(Event e, int x, int y) { System.out.println("Mouse works: (" + x + "," + y + ")"); return true; } }
class myCanvas extends Canvas { private int width; private int height;
public myCanvas(int w, int h) { width = w; height = h; reshape(0, 0, w, h); }
public void paint(Graphics g) { g.setColor(Color.blue); g.fillRect(0, 0, width, height); }
public boolean mouseDown(Event e, int x, int y) { if (( x < width) && (y <height)) { System.out.println("Canvas mouse works: ("
+ x + "," + y +")"); return true; } return false; //Not our mouseDown } }
6.8 滚 动 条
在 某 些 程 序 中, 需 要 调 整 线 性 的 值, 这 时 就 需 要 滚 动 条。 滚 动 条 提 供 了 易 于 操 作 的 值 的 范 围
或 区 的 范 围。
6.8.1 创 建 滚 动 条
当 创 建 一 个 滚 动 条 时, 必 须 指 定 它 的 方 向、 初 始 值、 滑 块 的 大 小、 最 小 值 和 最 大 值。
public Scrollbar(int orientation, int initialValue, int sizeOfSlider, int minValue, int maxValue);
下 面 是 一 个 例 子:
Scrollbar redSlider; public void init() { redSlider = new Scrollbar(Scrollbar.VERTICAL, 0, 1, 0, 255); add(redSlider); }
图 6.13
6.8.2 滚 动 条 事 件
和 其 他 接 口 元 件 一 样, 滚 动 条 产 生 一 个 你 可 以 控 制 的 事 件, 但 和 其 他 事 件 不 同, 你 必 须 直 接
使 用 成 员 函 数handleEvent( ), 而 不 能 使 用 成 员 函 数action( ) .
public boolean handleEvent (Event e) { if (e.target instanceof Scrollbar) { System.out.println("Scrollbar: " +
((Scrollbar)e.target).getValue( )); return true; } return super.handleEvent(e); }
6.8.3 滚 动 条 的 值 的 显 示
如 果 你 想 显 示 滑 块 所 在 位 置 的 值, 需 要 加 一 个 自 己 的 文 本 域。 下 面 是 一 个 例 子。
import java.awt.*; import java.applet.Applet;
public class redSlider extends Applet { Scrollbar redslider; TextField redvalue; Label redlabel;
public void init( ) { setLayout(new GridLayout(1, 3)); redslider = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 255); redvalue
= new TextField("0", 5); redvalue.setEditable(false); redlable = new Label("Red (0-255)"); add(redlabel); add(redslider);
add(redvalue); }
public boolean handleEvent(Event e) { if (e.target instanceof Scrollbar) {
redvalue.setText(Integer.toString(((Scrollbar)e.target).getValue())); return true; } return super.handleEvent(e); }
public boolean action(Event e, Object arg) { System.out.println("Event" + arg); return true; } }
图 6.14
本 章 小 结
1. Java提 供 了 生 成 一 个 良 好 的 图 形 用 户 接 口 所 需 要 的 一 些 基 本 元 件: 面 板(Panel)、 按 钮
(Button)、 标 签(Label)、 画 板(Canvases)、 滚 动 条(Scrollbar)、 列 表 框(List)、 文 本 域(Text
Field)、 文 本 区(Text Area)。 2. 大 部 分 元 件 都 有 自 己 的 事 件, 你 可 以 捕 捉 并 处 理 它 们。
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.243.11]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:205.619毫秒