第10章AWT组件库 JDK提供了能创建图形用户界面的许多组件。本模块考察这些AWT组件,以及非组件的AWT类,例如 Color、Font 和图形用户界面的打印 The Java Progra Gasing SM=ywcas.andY object-Oriented Progre Deplore Developing Grphi BUifinAGUI w) Fond Communicatio 第一节相关问题 讨论一下面的问题和本模块中的内容有关: 你现在已经知道如何为图形化输出和交互式用户输入来创建Java图形用户界面。然而,我们只介绍了能创建图形用 户界面的一些组件。其他的组件在图形用户界面中有什么用处呢? 第二节目标 完成本模块之后,你应该能够 认识关键的AWT组件 给你一个用户界面的描述,能够用AWT组件来创建一个用户界面。 给你一个AWT程序,能够改变AWT组件的颜色和字体 使用Java打印机制来打印一个用户界面 第三节AWT的特点 AWT的特性 AWT组件提供了控制界面外观,包括颜色和字体的机制 AWT还支持打印(这是在JDK11版中引入的) AWT提供了各种标准特性。本模块将介绍你可以使用的组件,并且概述了你需要知道的一些特殊情形。 首先将描述AWT的各个组件。它们用来创建用户界面。你需要知道所有图形用户界面组件,这样你就可以在创建你 自己的界面时选择合适的组件 AWT组件提供了控制界面外观的机制,包括用于文本显示的颜色和字体。 此外,AWT还支持打印。这个功能是在JDK1.版中引入的
113 第10章 AWT 组件库 JDK 提供了能创建图形用户界面的许多组件。本模块考察这些 AWT 组件,以及非组件的 AWT 类,例如 Color、Font 和图形用户界面的打印。 第一节 相关问题 讨论-下面的问题和本模块中的内容有关: 你现在已经知道如何为图形化输出和交互式用户输入来创建 Java 图形用户界面。然而,我们只介绍了能创建图形用 户界面的一些组件。其他的组件在图形用户界面中有什么用处呢? 第二节 目 标 完成本模块之后,你应该能够: - 认识关键的 AWT 组件。 - 给你一个用户界面的描述,能够用 AWT 组件来创建一个用户界面。 - 给你一个 AWT 程序,能够改变 AWT 组件的颜色和字体。 - 使用 Java 打印机制来打印一个用户界面。 第三节 AWT 的特点 AWT 提供了各种标准特性。本模块将介绍你可以使用的组件,并且概述了你需要知道的一些特殊情形。 首先将描述 AWT 的各个组件。它们用来创建用户界面。你需要知道所有图形用户界面组件,这样你就可以在创建你 自己的界面时选择合适的组件。 AWT 组件提供了控制界面外观的机制,包括用于文本显示的颜色和字体。 此外,AWT 还支持打印。这个功能是在 JDK1.1 版中引入的。 AWT 的特性 - AWT 组件提供了控制界面外观,包括颜色和字体的机制 - AWT 还支持打印(这是在 JDK1.1 版中引入的)
10.3.1按钮( Button) 你己经比较熟悉 Button组件了。这个组件提供了“按下并动作”的基本用户界面。可以构造一个带文本标签的按钮 用来告诉用户它的作用 Button b= new Button("Sample") b addActionListener(this)i Sam p 任何实现了被注册为监听者的 ActionListener接口的类,它的 action Performed方法将在一个按钮被鼠标点击“按下 时被调用。 public void actionPerformed(ActionEvent ae) System. out. println("Button press received. System. out. println("Button's action command is:+ ae. getActionc ommand())i 按钮被按下时调用的 getActionCommand(方法在缺省情况下将返回标签字符串。用按钮的 setAction Commando方法改 变动作命令和标签 Button b= new Button("Sample") b addActionListener (this add (b)i 注- Samp leButton和 ActionCommandButton的完整源代码可以在 cour se_ examples目录下找到 10.3.2复选框( Checkbox) Checkbox组件提供一种简单的“开/关”输入设备,它旁边有一个文本标签 Frame f new Frame("Checkbox") Checkbox one new Checkbox("One", true)i Checkbox two new Che ckbox("Two", false)i Checkbox three new Checkbox("Three", true)i one addItemListener(this) two addItemListener(this)i three addItemListener( this)i f. add (one) f. add(t wo)i f. add(three)i Checkbox u One Two Three 选取或不选取(取消)个复选框的事件将被送往 ItemListener接口。所传递的 Item Event包含 getStatechangeO方法, 它根据实际情况返回 Item Event DESELECTED或 Item Event selected。 getter方法将受到影响的复选框作为一个表示 这个复选框标签的 String对象返回
114 10.3.1 按钮(Button) 你已经比较熟悉 Button 组件了。这个组件提供了“按下并动作”的基本用户界面。可以构造一个带文本标签的按钮, 用来告诉用户它的作用。 Button b = new Button("Sample"); b.addActionListener(this); add(b); 任何实现了被注册为监听者的 ActionListener 接口的类,它的 actionPerformed()方法将在一个按钮被鼠标点击“按下” 时被调用。 public void actionPerformed(ActionEvent ae) { System.out.println("Button press received."); System.out.println("Button's action command is: " + ae.getActionCommand()); } 按钮被按下时调用的 getActionCommand()方法在缺省情况下将返回标签字符串。用按钮的 setActionCommand()方法改 变动作命令和标签。 Button b = new Button("Sample"); b.setActionCommand("Action Command Was Here!"); b.addActionListener(this); add(b); 注-SampleButton 和 ActionCommandButton 的完整源代码可以在 course_examples 目录下找到。 10.3.2 复选框(Checkbox) Checkbox 组件提供一种简单的“开/关”输入设备,它旁边有一个文本标签。 Frame f = new Frame("Checkbox") Checkbox one = new Checkbox("One", true); Checkbox two = new Checkbox("Two", false); Checkbox three = new Checkbox("Three", true); one.addItemListener(this); two.addItemListener(this); three.addItemListener(this); f.add(one); f.add(two); f.add(three); 选取或不选取(取消)一个复选框的事件将被送往 ItemListener 接口。所传递的 ItemEvent 包含 getStatechange()方法, 它根据实际情况返回 ItemEvent.DESELECTED 或 ItemEvent.SELECTED。getItem()方法将受到影响的复选框作为一个表示 这个复选框标签的 String 对象返回
class Handler imp lements ItemListener t public void itemS tateChanged(ItemEvent ev)t String state =deselected if (ev. getstateChange( ItemEvent. SELE CTED)I state ="selected System 10.33复选框组一单选框( Checkbox group- Radio button 复选框组提供了将多个复选框作为互斥的一个集合的方法,因此在任何时刻,这个集合中只有一个复选框的值是true 值为true的复选框就是当前被选中的复选框。你可以使用带有一个额外的 CheckboxGroup参数的构造函数来创建一组中 的每个复选框。正是这个 Check BoxGroup对象将各个复选框连接成一组。如果你这么做的话,那么复选框的外观会发生 改变,而且所有和一个复选框组相关联的复选框将表现出“单选框”的行为。 Frame f new Frame("Checkbox Group") CheckboxGroup cbg new Che ckboxGroup()i Checkbox one new Checkbox("One", false, cbg)i Checkbox three new Checkbox("Three", true, cbg)i one addItemListener(this)i two addItemListener(this)i three addItemListener( this)i f. add (one) f. add (t wo) f. add(three)i CheckboxGroup cone oTh 10.34下拉列表( Choice 下拉列表组件提供了一个简单的“从列表中选取一个”类型的输入。例如 Frame f new Frame("Choice")i Choice c= new Choice( C. add("First") c addItemListener (this f. add(c)i v Choice First二
115 class Handler implements ItemListener { public void itemStateChanged(ItemEvent ev) { String state = "deselected"; if (ev.getStateChange() == ItemEvent.SELECTED){ state = "selected"; } System.out.println(ev.getItem() + " " + state); } } 10.3.3 复选框组-单选框(Checkbox group-Radio Button) 复选框组提供了将多个复选框作为互斥的一个集合的方法,因此在任何时刻,这个集合中只有一个复选框的值是 true。 值为 true 的复选框就是当前被选中的复选框。你可以使用带有一个额外的 CheckboxGroup 参数的构造函数来创建一组中 的每个复选框。正是这个 CheckBoxGroup 对象将各个复选框连接成一组。如果你这么做的话,那么复选框的外观会发生 改变,而且所有和一个复选框组相关联的复选框将表现出“单选框”的行为。 Frame f = new Frame("Checkbox Group"); CheckboxGroup cbg = new CheckboxGroup(); Checkbox one = new Checkbox("One", false, cbg); Checkbox two = new Checkbox("Two", false, cbg); Checkbox three = new Checkbox("Three", true, cbg); one.addItemListener(this); two.addItemListener(this); three.addItemListener(this); f.add(one); f.add(two); f.add(three); 10.3.4 下拉列表(Choice) 下拉列表组件提供了一个简单的“从列表中选取一个”类型的输入。例如: Frame f = new Frame("Choice"); Choice c = new Choice(); c.add("First"); c.add("Second"); c.add("Third"); c.addItemListener(this); f.add(c);
点击下拉列表组件时,它会显示一个列表,列表中包含了所有加入其中的条目。注意所加入的条目是 String对象 v Choice First Second Third Itemlistener接口用来观察下拉列表组件的变化,其细节和复选框的相同 10.3.5画布( Canvas) 画布提供了一个空白(背景色)的空间。除非你用 setsizeo显式地定义它的大小,否则它的大小就是0×0。 画布的空间可以用来绘图、显示文本、接收键盘或鼠标的输入。后面的模块将告诉你如何有效地在AWT中绘图。 通常,画布用来提供一个一般的绘图空间或者为客户组件提供工作区域 Canvas 画布可以“监听”所有适用于一个普通组件的事件。特别地,你还可能想增加 KeylListener、 Mouse Motion listener和 Mouselistener对象,以允许某种方式对用户输入作出反应 注一如要在画布中接收键盘事件,必须调用画布的 request Focus0方法。如果缺少这个步骤,一般是不能将击键“导向 画布的。键盘事件会送往另一个组件,或整个地丢失了。示例代码 over leaf(第228页)表明了这一点。 下面是画布的一个范例。每击一次键,这个程序就改变一次画布的颜色 import java. awt event.* port java util.* implements keyListener Color colors [] =Color. red, Color green, Color blue i public void paint(Graphics g) g setcolor(colors [index]) g fillRect(0,0, getsize().width, getsize(). height)i
116 点击下拉列表组件时,它会显示一个列表,列表中包含了所有加入其中的条目。注意所加入的条目是 String 对象。 ItemListener 接口用来观察下拉列表组件的变化,其细节和复选框的相同。 10.3.5 画布(Canvas) 画布提供了一个空白(背景色)的空间。除非你用 setSize()显式地定义它的大小,否则它的大小就是 0×0。 画布的空间可以用来绘图、显示文本、接收键盘或鼠标的输入。后面的模块将告诉你如何有效地在 AWT 中绘图。 通常,画布用来提供一个一般的绘图空间或者为客户组件提供工作区域。 画布可以“监听”所有适用于一个普通组件的事件。特别地,你还可能想增加 KeyListener、MouseMotionListener 和 MouseListener 对象,以允许某种方式对用户输入作出反应。 注-如要在画布中接收键盘事件,必须调用画布的 requestFocus()方法。如果缺少这个步骤,一般是不能将击键“导向” 画布的。键盘事件会送往另一个组件,或整个地丢失了。示例代码 overleaf(第 228 页)表明了这一点。 下面是画布的一个范例。每击一次键,这个程序就改变一次画布的颜色。 import java.awt.*; import java.awt.event.*; import java.util.*; public class MyCanvas extends Canvas implements KeyListener { int index; Color colors[] = {Color.red, Color.green, Color.blue }; public void paint(Graphics g) { g.setColor(colors[index]); g.fillRect(0,0,getSize().width,getSize().height); } public static void main(String args[]) {
("Canvas") My Canvas mc new My Canvas() f. add(mc, Bor derLa yout CENTER); f setsize(150, 150) mc.addKeyLis tener(mc) f public void key Typed(KeyEvent ev) aint()i public void keyRe leased(Key Event ev) 10.3.6标签(Labe) 一个标签对象显示一行静态文本。程序可以改变文本,但用户不能改变。标签没有任何特殊的边框和装饰 Label l new Label("Hello " add(1) Label llo 标签通常不处理事件,但也可以按照和画布相同的方式来处理事件。也就是说,只有调用了 requestFocusO方法后 才能可靠地检取击键事件 10.3.7文本域( Textiel 文本域是一个单行的文本输入设备。例如 TextField f new Text Field("Single line f addActionListener(this) add (f) Text Fiel Single Lin 因为只允许有一行,所以当按下 Enter或 Return键时, Action Listener可以通过 action Performed知道这个事件。如果 需要,还可以增加其他的组件监听者
117 Frame f = new Frame("Canvas"); MyCanvas mc = new MyCanvas(); f.add(mc,BorderLayout.CENTER); f.setSize(150, 150); mc.requestFocus(); mc.addKeyListener(mc); f.setVisible(true); } public void keyTyped(KeyEvent ev) { index++; if (index == colors.length) { index =0; } repaint(); } public void keyPressed(KeyEvent ev) { } public void keyReleased(KeyEvent ev) { } } 10.3.6 标签(Label) 一个标签对象显示一行静态文本。程序可以改变文本,但用户不能改变。标签没有任何特殊的边框和装饰。 Label l = new Label( " Hello " ); add(l); 标签通常不处理事件,但也可以按照和画布相同的方式来处理事件。也就是说,只有调用了 requestFocus()方法后, 才能可靠地检取击键事件。 10.3.7 文本域(Textfield) 文本域是一个单行的文本输入设备。例如: TextField f = new TextField("Single line" " , 30); f.addActionListener(this); add(f); 因为只允许有一行,所以当按下 Enter 或 Return 键时,ActionListener 可以通过 actionPerformed()知道这个事件。如果 需要,还可以增加其他的组件监听者