1、 画布(Canvas):只能绘图,处理鼠标和键盘事件。 窗体(Frame):顶级容器,关闭时触发WindowEvent; 面板(Panel): 可进行嵌套布局的容器,面板作为一个部件加入到窗体容器中,面板作为容器又可以放其他面板和部件。 对话框(Dialog):包括模式和非模式两类,依赖其他窗体。 文件对话框(FileDialog):用于打开和关闭文件。 菜单(Menu)、菜单条(MenuBar)和菜单项(MenuItem):只能对Frame创建菜单,菜单条中添加菜单,菜单中可以添加菜单项或子菜单。(3)布局Java通过布局管理器对所有构件进行管理,以支持跨平台的动态布局效果。常见布局管理器有
2、5种,见表11-1所示。表11-1 常见布局管理器及特点布局特点FlowLayout布局组件按照加入的先后顺序从左到右排放,放不下再换至下一行,部件大小不变,是Applet和Panel的默认布局。BorderLayout布局将容器分为东(East)、南(South)、西(West)、北(North)、中(Center)五个区域,加入组件用命令:add(方位名字符串, 组件)。是Frame、Dialog的默认布局。GridLayout布局将容器空间分为若干行乘若干列的网格区域,组件按从左向右,从上到下的次序被加到各单元格中,组件的大小将调整为与单元格大小相同。CardLayout布局将组件叠成卡
3、片的形式,每个组件占用一块卡片,通过卡片的翻动选择要显示的组件。GridBagLayout布局在GridLayout的基础上发展而来,将整个容器分成若干行、列组成的单元,但各行可以有不同的高度,每栏也可以有不同的宽度,一个部件可以占用一个、也可以占用多个单元格。2.3 事件处理(1) 事件处理机制 涉及对象有事件源、事件、事件处理者(监听者)。事件源是发生事件的对象;事件对象是提供事件相关信息的对象;事件处理者则是消化事件,完成特定处理的对象。 Java采用委托(授权)事件处理机制;事件源对其可能发生的事件分别授权不同的事件处理者处理;通过如下命令注册监听者:addXXXListener(XX
4、XListener a);其中,XXX与相应事件类型相关,例如:按钮点击动作事件对应标记为“Action”.要注销监听者使用removeXXXListener(XXXListener a); 事件处理者必须实现某类事件相对应的接口,只有符合接口规范的对象才能作为事件处理者,通过编写相应方法实现事件的处理。例如,ActionListener接口中定义了如下方法用来处理事件。 public void actionPerformed(ActionEvent e); Java为每类事件提供了一个相应的接口。(2) 事件与事件处理 java.util.EventObject是所有事件类的父类;java.
5、awt.AWTEvent是所有AWT事件类的父类,其包括低级事件和基于语义的高级事件。 XXXEvent对应的事件处理接口通常为XXXListener,但鼠标事件(MouseEvent)对应的事件处理接口有两个,一个是MouseListener,另一个是MouseMotionListener,它们分别用来处理鼠标的移动(含拖动)与鼠标的点击动作。各类接口的事件处理方法见表11-2。表11-2 AWT事件接口及处理方法描述信息接口名称方法(事件)点击按钮、点击菜单项、文本框按回车等动作ActionListeneractionPerformed(ActionEvent)选择了可选项的项目ItemL
6、isteneritemStateChanged(ItemEvent)文本部件内容改变TextListenertextValueChanged(TextEvent)移动了滚动条等组件AdjustmentListeneradjustmentVlaueChanged(AdjustmentEvent)鼠标移动MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠标点击等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(Mous
7、eEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)键盘输入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)组件收到或失去焦点FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)组件移动、缩放、显示/隐藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResiz
8、ed(ComponentEvent)componentShown(ComponentEvent)窗口事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified (WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)容器增加/删除组件ContainerListenercomponentAdded(
9、ContainerEvent)componentRemoved(ContainerEvent) 事件适配器Java中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为XxxAdapter,在该类中以空方法体实现了相应接口的所有方法,程序员设计可通过继承适配器类来编写监听者类,在类中只需给出关心的方法,从而减轻工作量。 在事件处理代码中区分事件源在事件处理代码中可通过相应的方法得到事件源对象或与事件源相关的信息,见表11-3,通过这些信息可区分事件源。表11-3 在事件处理代码中区分事件源事件类型方法作用ActionEventgetSource()返回事件对象对应的事件源对象ge
10、tActionCommand()返回动作命令字符串WindowEventgetWindow()返回窗体事件对应的窗体对象ItemEventgetItemSelectable()返回选择事件对应的事件源对象KeyEventgetKeyChar()返回键盘事件按键对应的字符getKeyCode()返回键盘事件所按键的编码值3 样例程序样例1:在应用程序窗体中安排1个文本框,一个标签。在文本框输入一个数字(0-9),按回车键,在标签处显示对应的英文单词。 0-zero,1-one,.【参考程序】import java.awt.*;import java.awt.event.*;public clas
11、s myFrame extends Frame implements ActionListener Label res;TextField my;String word=zero,onetwothreefourfivesixseveneightnineten;public myFrame () my =new TextField(20); res=new Label( 英文单词 ); setLayout(new FlowLayout(); add(my); add(res); my.addActionListener(this);public void actionPerformed(Acti
12、onEvent e) String s=my.getText(); int n=Integer.parseInt(s); res.setText( wordn );public static void main(String args) Frame my= new myFrame(); my.setSize(300,300); my.setVisible(true);【编程技巧】(1) 从数组中单词与下标位置之间的对应关系认识翻译目标。(2) 事件注册处理过程。(3) 如何读取文本框数据并转化为整数和设置标签内容。【自己练习】以上程序执行时要求用户输入一个0到9之间的数字,但由于没有提示,用户
13、可能输入数据错误,从而产生程序运行错误,改进应用界面,给用户输入提示。样例2:在应用程序窗体中安排两个文本框分别用来输入两个整数,两个按钮分别为 “+”,“*”,一个结果标签。点击按纽“+”将两文本框的数据做加法运算;点击按钮“*”做乘法运算,将结果显示在标签中。TextField f1,f2;public myFrame () f1 =new TextField(20); f2 =new TextField(20); Button b1=new Button(+ Button b2=new Button(* 运算结果 setLayout(new GridLayout(3,2); add(f1
14、); add(f2); add(b1); add(b2);add(res); b1.addActionListener(this); b2.addActionListener(this); int x1=Integer.parseInt(f1.getText(); int x2=Integer.parseInt(f2.getText(); if (e.getActionCommand().equals() /区分用户点击的是哪个按钮 res.setText(+(x1+x2); else+(x1*x2); my.setSize(200,200);【说明】本例在一个事件处理程序中有来自两个事件源的
15、事件,因此在处理时要区分处理,区分命令按钮有两种办法:一种是通过按钮的命令名(默认是按钮上的文本),比较时通过字符串比较;另一种是通过事件的getSource()方法得到事件源对象,但这次比较的是与对象引用变量进行比较。(1) 在同一事件处理方法中如何区分事件源;(2) 将多个实例方法内要共享访问的部件对象定义为属性变量,如上面的标签和两个文本框。【自己练习】利用匿名内嵌类为以上问题的每个事件源单独编写一段事件处理代码,这样在事件处理时不用区分事件源。样例3:实现一个简单的图像浏览器,部署“上一张”、“下一张”两个按钮,点击按钮可前后翻阅图片。import java.applet.*;publ
16、ic class ShowAnimator extends Applet implements ActionListener Image m_Images; /保存图片序列的Image数组 int totalImages = 18; /图片序列中的图片总数18 int currentImage = 0; /当前时刻应该显示图片序号 Button b1,b2; public void init() m_Images = new ImagetotalImages; for(int i=0; i0) currentImage = -currentImage; /上一张 currentImage =
17、+currentImage % totalImages; /下一张 repaint(); (1) 将绘制图像存入数组中,利用一个变量代表当前要绘制图像对应下标。(2) 事件处理中,前后翻动图片的实现就是控制变量值的增减。(3) 由repaint()方法调用paint方法实现图像重绘。【自己练习】增加一个画布,将图片绘制到画布上,如何修改程序。样例4:统计一个文本域中行、单词、字符的数量。【分析】在图形界面中除了安排文本域输入数据外,还安排一个按钮触发统计操作,另外安排3个标签显示结果。界面采用GridLayout布局,如图11-3所示。 import java.awt.*; import ja
18、va.awt.event.*; import java.applet.*; public class TextCounter extends Applet implements ActionListener TextArea textInput;Label lineCountLabel;Label wordCountLabel;Label charCountLabel; public void init() textInput = new TextArea(); Panel south = new Panel(); south.setLayout( new GridLayout(4,1,2,2
19、) ); Button countButton = new Button(Process the Text countButton.addActionListener(this); south.add(countButton); lineCountLabel = new Label( Number of lines: south.add(lineCountLabel); wordCountLabel = new Label( Number of words: south.add(wordCountLabel);charCountLabel = new Label( Number of char
20、s: south.add(charCountLabel); setLayout( new BorderLayout(2,2) ); add(textInput, BorderLayout.CENTER); add(south, BorderLayout.SOUTH); public void actionPerformed(ActionEvent evt) String text; / 用户从文本框输入的文本. int charCt, wordCt, lineCt; / 字符,单词和行的个数. text = textInput.getText(); charCt = text.length(); / 字符数正好为文本串的长度. wordCt = 0; for (int i = 0; i 1 Character.isLetter(text.charAt(i-2) ) / 否. 是一个单词的继续 / 是. 该字符前面为非字母. if (startOfW
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1