学习导读学习导读 首先,我们学习一些基本的图形编程知识,首先,我们学习一些基本的图形编程知识,包括窗口的显示及外观设置、在窗口中显示文字包括窗口的显示及外观设置、在窗口中显示文字和图像等;和图像等;接下来,介绍接下来,介绍Java的事件处理机制,例如如的事件处理机制,例如如何在程序中接收并处理如键盘按键和鼠标点击等何在程序中接收并处理如键盘按键和鼠标点击等“事件事件”;最后,系统地介绍图形用户界面中常用组件最后,系统地介绍图形用户界面中常用组件的用法,如布局管理器、文本框、复选框、菜单、的用法,如布局管理器、文本框、复选框、菜单、对话框等对话框等教学重点与难点教学重点与难点v容器、组件、布局和观感容器、组件、布局和观感vJava的事件处理机制的事件处理机制v布局管理器布局管理器v各种各种Awt组件的用法组件的用法v各种各种Swing组件的用法组件的用法v窗口事件、键盘事件、鼠标事件的处理窗口事件、键盘事件、鼠标事件的处理 Java 1.0的出现带来了抽象窗口工具箱(AWT)设计目标是希望构建一个通用的GUI,使得利用它编写的程序能够运行在所有的平台上,以实现Sun公司提出的口号“一次编写,随处运行”。
在Java 1.2中,Sun公司推出了新的用户界面库:Swing相对AWT来说,Swing功能更强大、使用更方便,它的出现使得Java的图形用户界面上了一个台阶但是,Swing并没有代替AWT在Java 1.1中,AWT事件处理模型有了根本改变Swing使用的仍然是Java 1.1的事件处理模型9.1图形用户界面设计概述9.1.1 GUI9.1.1 GUI支持包和简单支持包和简单GUIGUI程序例程序例1.java.awt包 vJava语言在java.awt包中提供了大量地进行GUI设计所使用的类和接口,包括绘制图形、设置字体和颜色、控制组件、处理事件等内容,AWT是Java语言进行GUI程序设计的基础2.javax.swing包vSwing包是Java基础类库(Java Foundation Classes,JFC)的一部分Swing提供了从按钮到可分拆面板和表格的所有组件AWTAWT组件和对应的组件和对应的SwingSwing组件,从名称上很容易记忆和区别组件,从名称上很容易记忆和区别v例如,例如,AWTAWT的框架类、面板类、按钮类和菜单类,被命名的框架类、面板类、按钮类和菜单类,被命名为为FrameFrame、PanelPanel、ButtonButton和和MenuMenu,而,而SwingSwing对应的组件类对应的组件类被命名为被命名为JFrameJFrame、JPanelJPanel、JButtonJButton和和JMenuJMenu。
与与AWTAWT组件组件相比,相比,SwingSwing组件的名前多一个组件的名前多一个“J”J”字母v另外,另外,AWT AWT 组件在组件在java.awtjava.awt包中包中,而而SwingSwing组件在组件在javax.swingjavax.swing包中3.一个Java GUI简单程序【例9.1】课本P188Java Swing GUI应用程序中的基本代码如下:v(1)(1)引入合适的包和类引入合适的包和类一般的Swing GUI应用程序应包含程序中的前三个引入语句,它们分别表示引入awt包、awt事件处理包和swing包其他包按需引入由于Swing组件使用AWT的结构,包括AWT的事件驱动模式,所以,使用swing组件的程序一般需要使用awt包v(2)(2)使用缺省的观感或设置自己的观感(使用缺省的观感或设置自己的观感(Look and FeelLook and Feel)v(3)(3)设置一个顶层的容器设置一个顶层的容器v(4)(4)根据需要,使用缺省的布局管理器或设置另外的布局管理根据需要,使用缺省的布局管理器或设置另外的布局管理器器v(5)(5)定义组件并将它们添加到容器定义组件并将它们添加到容器v(6)(6)对组件或事件编码对组件或事件编码9.1.2 9.1.2 容器、组件、布局和观感容器、组件、布局和观感1.容器(Container)和组件(Component)v一个Java的图形用户界面的最基本元素是组件,组件是可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,如一个按钮、一个文本框等。
v容器容器实际上是一种具有容纳其他组件和容器的功能的组件抽象类Container是所有容器的父类,其中包含了很多有关容器的功能和方法而类Container又是Java语言的组件类Component的子类2.布局管理器(Layout Manager)v为了使得图形用户界面具有良好的平台无关性,在Java语言中提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式容器中的组件定位由布局管理器决定每个容器都有一个缺省的布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其相应的布局管理器但也可以不用缺省的布局管理器,在程序中指定其新的布局管理器vJava平台提供多种布局管理器,常用的有FlowLayout、BorderLayout、GridLayout、CardLayout、BoxLayout和GridBagLayout等使用不同的布局管理器,组件在容器上的位置和大小都是很不一样的v在程序中安排组件的位置和大小时,应该注意:v(1)容器中的布局管理器负责各个组件的大小和位置因此用户无法在这种情况下直接设置这些属性若试图使用Java语言提供的setLocation()、setSize()、setBounds()等方法,则都会被布局管理器覆盖。
v(2)若用户确实需要亲自设置组件的位置和大小,则应取消该容器的布局管理器,方法为:setLayout(null);v随后,用户必须使用setLocation()、setSize()、setBounds()等方法为组件设置大小和位置,但这种方法将会导致程序的系统相关v在一个GUI应用程序的界面上,除了可以见到上述的标准GUI元素外,还可以见到一些非交互的起到装饰、美化界面的作用的几何图形、图案、图像等内容3.观感(Look and Feel)vJava swing的一个重要特征是它的可插入的“观感”体系一个Swing应用程序或一个最终用户可指明所需要的观感,使得Swing应用程序的外观和行为都可以被定制Swing运行一个缺省的Java观感(也称为Metal观感),还实现了模仿Motif和Windows的观感这样,一个Swing程序可拥有Java程序的独特外观,也可以拥有熟悉的Windows操作系统外观v在本章稍后部分的单选按钮的程序例中分别显示了Windows、Motif和Metal三种不同风格的观感v一般在应用程序的JFrame的构造方法中或在JApplet的init()方法中进行观感的设置。
9.1.39.1.3事件处理事件处理(重要重要)v在一个GUI程序中,为了能够接收用户的输入、命令的按键和鼠标操作,程序系统首先应该能够识别这些操作并做出相应的响应通常一个键盘和鼠标操作将引发一个系统预先定义好的事件,用户程序只要编写代码定义每个事件发生时程序应做出何种响应即可这些代码会在它们对应的事件发生时由系统自动调用,这就是GUI程序中事件和事件响应的基本原理v如果用户通过用户界面执行了一个动作,这将导致一个事件的发生事件是描述用户所执行操作的数据对象在Java中,定义了各种不同类型的事件类,用来描述各种类型的用户操作v 事件是由事件源产生的,事件的产生者称为事件源例如,在Button组件上点击鼠标会产生以这个Button为源的一个事件:ActionEventv 事件的行为多种多样,由不同的事件监听器处理,编写事件处理程序首先应确定关注的事件属于何种监听器类型,确定后对该监听器进行注册.当事件源产生了一个事件以后,该事件就委托给已经注册的事件监听器,事件监听器监听到事件后,负责执行相应的响应方法v一个事件监听器是一个实现了给定接口的类的实例,接口中定义了相应的响应方法v在AWT中,提供11种标准的监听器类型,见下表。
监听器 适配器类 注册方法 ActionListener addActionListenerAdjustmentListener addAdjustmentListenerComponentListener ComponentAdapter addComponentListenerContainerListener ContainerAdapter addContainerListenerFocusListener FocusAdapter addFocusListenerItemListener addItemListenerKeyListener KeyAdapter addKeyListenerMouseListener MouseAdapter addMouseListenerMouseMotionListener MouseMotionAdapter addMouseMotionListenerTextListener addTextListenerWindowListener WindowAdapter addWindowListenerv在确定监听器类型后,要用事件源类的注册方法来注册一个监听器类的对象。
这样,事件源产生的事件会传送给已注册的处理该类事件的监听器对象,该对象将自动调用相应的事件处理方法来处理该事件v具体的注册方法是:用监听器类的对象作为参数调用事件源本身的addXxxListener()方法该方法的参数是一个监听器类的对象,有多种形式例如:(1)(1)分离的监听器类,该类通常为继承相应事件适配器类的子类,类分离的监听器类,该类通常为继承相应事件适配器类的子类,类中包含了事件处理方法参数是该类的一个对象中包含了事件处理方法参数是该类的一个对象参见例参见例(2)(2)实现监听器接口,参数为实现监听器接口,参数为thisthis,表示本对象就是一个监听器类的,表示本对象就是一个监听器类的对象在本类中包含事件处理方法如课本例对象在本类中包含事件处理方法如课本例9.19.1(3)(3)有名内部类,参数形式为继承事件适配器类的子类对象,在子类有名内部类,参数形式为继承事件适配器类的子类对象,在子类中包含事件处理方法中包含事件处理方法4)(4)匿名内部类,参数形式为用匿名内部类,参数形式为用newnew开始的一个无名的类定义其中包开始的一个无名的类定义其中包含事件处理方法含事件处理方法。
我们可以通过以下方法来注册事件监听器对象:eventSourceObject.addEventListener(eventListenerObject);以按钮类为例:MyActionListener listener=.;Button btn=new Button(“提交”);btn.addActionListener(listener);事件监听器对象listener所属的类MyActionListener必须实现相应的接口,以响应事件:public class MyActionListener implements ActionListener.public void actionPerformed(ActionEvent evt)/相应的响应操作9.2 布局管理器v在容器中所有组件的布局(位置和大小)由布局管理器来控制在Java语言中提供了FlowLayout、BorderLayout、GridLayout、CardLayout和GridBagLayout等多种布局管理器v每种容器都有自己缺省的布局管理器缺省地,JPanel使用FlowLayout,而内容窗格 ContentPanev(JApplet、JDialog和JFrame对象的主容器)使用BorderLayout。
如果不希望使用缺省的布局管理器,则可使用所有容器的父类Container的setLayout()方法来改变缺省的布局管理器1.FlowLayout1.FlowLayoutvFlowLayout布局是一种最基本的布局这种布局指的是把组件一个接一个从左至右、从上至下地依次放在容器上,每一行中的组件缺省为居中对齐当容器的尺寸改变后,组件的大小不变,但布局将会随之变化vFlowLayout是Applet和JPanel的缺省布局管理器FlowLayout类的构造方法如下:FlowLayout()创建每行组件对齐方式为居中对齐、组件间距为5个像素单位的对象FlowLayout(int align)创建指定每行组件对齐方式、组件间距为5个像素单位的对象,align可取三个静态常量LEFT、CENTER和RIGHT之一(分别表示左、中、右对齐方式)FlowLayout(int align,int hgap,int vgap)创建指定每行组件对齐方式的对象,该对象也使用参数vgap和hgap指定了组件间的以像素为单位的纵横间距向使用FlowLayout布局的容器添加组件可简单地使用下面的语句:add(组件名);v例:import java.awt.*;v public class MyFlowLayoutv public static void main(String args)vFrame f=new Frame();vf.setLayout(new FlowLayout();vButton b1=new Button(Fisrt);vButton b2=new Button(Seconed);vButton b3=new Button(Third);vf.add(b1);f.add(b2);f.add(b3);v f.setSize(300,100);f.setVisible(true);vv2BorderLayoutvBorderLayout 是内容窗格的缺省布局管理器。
内容窗格是框架JFrame,小程序JApplet和对话框JDialog的主容器BorderLayout将容器的布局分为五个区:北区、南区、东区、西区和中区这几个区的分布规律是“上北下南,左西右东”当容器的大小改变时,容器中的各个组件相对位置不变,其中间部分组件的尺寸会发生变化,四周组件宽度固定不变vBorderLayout类的构造方法如下:BorderLayout()创建组件间无间距的BorderLayout对象BorderLayout(int hgap,int vgap)创建有指定组件间距的对象v向BorderLayout布局的容器添加组件时,每添加一个组件都应指明该组件加在哪个区域中add()方法的第二个参数指明加入的区域,区域东南西北中可用五个静态常量表示:BorderLayout.EAST、BorderLayout.SOUTH、BorderLayout.WEST、BorderLayout.NORTH和BorderLayout.CENTERv【例9.3】将五个按钮加入BorderLayout的五个区import java.awt.import java.awt.*;import javax.swing.import javax.swing.*;public class BorderLayoutDemo extends JApplet public class BorderLayoutDemo extends JApplet public void init()public void init()Container c=getContentPane();Container c=getContentPane();c.add(new Button(c.add(new Button(北北North),BorderLayout.NORTH);North),BorderLayout.NORTH);c.add(new Button(c.add(new Button(南南South),BorderLayout.SOUTH);South),BorderLayout.SOUTH);c.add(new Button(c.add(new Button(东东East),BorderLayout.EAST);East),BorderLayout.EAST);c.add(new Button(c.add(new Button(西西West),BorderLayout.WEST);West),BorderLayout.WEST);c.a d d(n e w B u t t o n(c.a d d(n e w B u t t o n(中中 C e n t e r ),C e n t e r ),BorderLayout.CENTER);BorderLayout.CENTER);v程序运行的结果见下图。
v3GridLayoutvGridLayout布局是将容器的空间分成若干行和列的一个个网格,可以给出网格的行数和列数,组件添加到这些网格中当改变容器的大小后,其中的组件相对位置不变,但大小改变容器中各个组件同高度、同宽度各个组件缺省的排列方式为:从上到下,从左到右vGridLayout类的构造方法如下:public GridLayout()创建单行每个组件一列的GridLayout对象public GridLayout(int rows,int cols)创建指定行列数的GridLayout对象public GridLayout(int rows,int cols,int hgap,int vgap)创建指定行列数的GridLayout对象v因为没有容器缺省使用GridLayout,因此在使用GridLayout前,要用setLayout()方法将容器的布局管理器设置为GridLayoutv在向GridLayout添加组件时,组件加入容器要按序进行,每个网格中都必须加入组件,若希望某个网格为空,可以为该网格加入一个空的标签:add(new JLabel()vimport java.awt.*;vimport java.applet.*;vpublic class Calc extends Applet vButton button0=new Button(0);vButton button1=new Button(1);vButton button2=new Button(2);vButton button3=new Button(3);vButton button4=new Button(4);vButton button5=new Button(5);vButton button6=new Button(6);vButton button7=new Button(7);vButton button8=new Button(8);vButton button9=new Button(9);vButton buttonAdd=new Button(+);vButton buttonSubtract=new Button(-);vButton buttonMultiply=new Button(*);vButton buttonDivide=new Button(/);vButton buttonEqual=new Button(=);vTextField textField=new TextField();vvpublic void init()vsetLayout(new GridLayout(4,2,10,10);vadd(textField);vadd(button7);vadd(button8);vadd(button9);vadd(buttonEqual);vadd(button4);vadd(button5);vadd(button6);vadd(button0);vadd(button1);vadd(button2);vadd(button3);vadd(buttonAdd);vadd(buttonSubtract);vadd(buttonMultiply);vadd(buttonDivide);vvv【例9.4】GridLayout布局。
import java.awt.import java.awt.*;import javax.swing.import javax.swing.*;public class GridLayoutDemo extends JApplet public class GridLayoutDemo extends JApplet public void init()public void init()Container c=getContentPane();Container c=getContentPane();c.setLayout(new GridLayout(3,2);c.setLayout(new GridLayout(3,2);c.add(new Button(1);c.add(new Button(1);c.add(new Button(2);c.add(new Button(2);c.add(new Button(3);c.add(new Button(3);c.add(new Button(4);c.add(new Button(4);c.add(new Button(5);c.add(new Button(5);c.add(new Button(6);c.add(new Button(6);v 例9.4运行的结果如下图所示。
4.CardLayoutvCardLayout布局管理器能够使得多个组件共享同一显示空间,这些组件之间的关系像一叠重叠的扑克牌,只有最上面的组件是可见的注意:在一个显示空间(卡片)中只能显示一个组件,因此,可使用容器嵌套的方法来显示多个组件vCardLayout类的构造方法如下:CardLayout()创建间距为零的对象CardLayout(int hgap,int vgap)创建带有水平hgap和垂直vgap间距的对象v为了使用叠在下面的组件,可以为每个组件取一名字,名字在用add()方法向容器添加组件时指定,需要某个组件时通过show()方法指定该组件的名字来选取它也可以顺序使用这些组件,或直接指明选取第一个组件(用first()方法)或最后一个组件(用last()方法)v【例9.5】CardLayout布局import java.awt.import java.awt.*;import javax.swing.import javax.swing.*;public class CardLayoutDemo extends JAppletpublic class CardLayoutDemo extends JApplet CardLayout cl=new CardLayout(20,40);CardLayout cl=new CardLayout(20,40);/组件在卡片中有边界组件在卡片中有边界 JButton b1=new JButton(JButton b1=new JButton(卡片一卡片一););JButton b2=new JButton(JButton b2=new JButton(卡片二卡片二););JButton b3=new JButton(JButton b3=new JButton(卡片三卡片三););public void init()public void init()getContentPane().setLayout(cl);getContentPane().setLayout(cl);getContentPane().add(card1,b1);getContentPane().add(card1,b1);getContentPane().add(card2,b2);getContentPane().add(card2,b2);getContentPane().add(card3,b3);getContentPane().add(card3,b3);v程序运行结果如下图所示。
程序中的三个按钮组件顺序添加到卡片布局管理器的各个卡片上,它们共享同一显示区域,因此只能见到最上面的“卡片一”按钮5.GridBagLayout5.GridBagLayoutvGridBagLayout是最复杂也最灵活的布局管理器这个布局管理器将组件放入单元格中,但允许一些组件跨越单元格v可用GridBagLayout类的构造方法GridBagLayout()来创建一个GridBagLayout布局管理器因GridBagLayout布局设置比较复杂,这里就不介绍了,请读者参看API说明或其他资料6.6.自定义布局自定义布局v若希望按照自己的要求来进行组件和界面图形元素的布局,可用容器的setLayout(null)方法将容器的布局管理器设置为空,然后用下面的方法设置组件在容器中的位置和大小:setBounds(int a,int b,int width,int height)v其中,参数a和b指定矩形形状的组件左上角在容器中的坐标,width和height指定组件的宽和高v【例9.6】设置自己的布局管理器import java.awt.import java.awt.*;import javax.swing.import javax.swing.*;class NullLayout extends JFrameclass NullLayout extends JFrame NullLayout()NullLayout()super(super(建设自己的布局管理器建设自己的布局管理器););Container c=getContentPane();Container c=getContentPane();/也可不用内容窗格也可不用内容窗格 c.setLayout(null);c.setLayout(null);JButton jb1=new JButton(JButton jb1=new JButton(按钮按钮1);1);JButton jb2=new JButton(JButton jb2=new JButton(按钮按钮2);2);c.add(jb1);c.add(jb2);c.add(jb1);c.add(jb2);jb1.setBounds(10,10,100,30);jb1.setBounds(10,10,100,30);jb2.setBounds(10,50,100,30);jb2.setBounds(10,50,100,30);public static void main(String args)public static void main(String args)NullLayout nl=new NullLayout();NullLayout nl=new NullLayout();nl.setSize(200,150);nl.setSize(200,150);nl.setVisible(true);nl.setVisible(true);程序的运行结果如下图所示。
注意,采用这种方式的布局,组件的位置和大小将不随窗口大小的变化而变化下图为例9.6的运行界面补:创建简单的GUI应用程序1.创建窗口v在软件项目编程中,和用户建立接口的首先是一个特殊的窗口中,这个窗口是一个特殊的容器,在这个容器中可以容纳其他的可视化组件(Component),或者是另外的容器,而这些组件之间又进行着有机的整合和联系,最终构成一个良好的可视化接口v这个特殊的窗口可以是一个简单的窗口(Window或JWindow类),但是它没有提供标题栏,也没有提供最大化和最小化以及关闭按钮,同时也没有在图形化接口操作系统中所看见的大多数窗口所具有的其他功能.另外这个特殊的窗口也可以是一个框架,而它有标题栏、窗口管理按钮、状态区以及其他窗口功能所以一般的创建窗口程序的首要任务是创建一个继承Frame(或JFrame)类的子类,并用它作为特殊窗口来容纳其他容器或组件v首先声明一个MyFrame类来继承JFrame,代码如下:public class MyFrame extends Frame/代码v因为用到了Frame类,所以要引用该类所在的包v因为继承了Frame类,所以MyFrame类中基本上已经完成了一个框架的创建,剩下的任务就是对这个框架进行一定的修饰,如调用超类的构造方法进行初始设置的设定,确定框架应该显示的位置和大小,决定用户如何关闭框架、显示框架等。
超类Frame有两个构造方法,Frame()和Frame(String name).后者参数设定了标题栏,如果选用无参的构造方法,则标题栏的设定可以用setTitle(String Name)方法实现如在MyFrame构造方法中有:super();this.setTitle(“框架”);/其中this可以省略v框架的显示位置的设定:vsetLocation(Point p)其中p是Java.awt.Point类的一个对象,如:vsetLocation(new Point(100,100);v框架大小的显示:vsetSize(int width,int height)v框架大小和位置的显示也可以用一个方法完成:vsetBounds(100,100,400,200)是指框架从(100,100)画到点(400,200)处v框架层次关系ObjectComponentContainerWindowFrameComponent类是所有GUI对象的祖先,Window类是Frame类的父类对于框架外观的操作比较重要的方法如下:vsetTitle设置窗口中标题栏的文字vsetResizable设置用户是否可以改变框架大小。
vdispose方法关闭窗口,并回收该窗口的所有资源vsetSize设置组件的大小vsetBackground设置组件的背景颜色vsetVisible设置组件是否可见vsetBounds重新设置组件的大小和位置2.执行程序 在完成了基本的创建一个在指定位置显示指定大小的并且有指定标题的框架之后,接下来要执行并显示它,而这一步骤需要编写一个main()方法,在main()方法中创建已编写好的MyFrame类的对象mf一个框架在创建的同时缺省为这个框架是可视的,否则调用对象的setVisible()方法,同时这个方法也可以在MyFrame类的构造方法中实现如setVisible(true).3.退出程序 为了退出程序,关闭显示结果,Java程序允许用户单击框架的“关闭”按钮来关闭,这需要对当前生成的窗口进行监视,监视用户操作需要使用事件处理类,实现WindowListener接口可以实现这一操作,WindowListener接口定义了以下7个方法来实现窗口的相应的操作:vwindowActivated():当窗口成为活动窗口时响应此方法,这意味着这个接口可以接收来自键盘的响应vwindowDeactivated():窗口变为非活动的,不能接收键盘的响应。
vwindowClosing():窗口正在关闭vwindowClosed():窗口已经关闭vwindowOpened():窗口可见vwindowIconified():窗口已经最小化vwindowDeiconified():窗口已经最大化 v定义一个类来实现WindowListener接口,在感兴趣的方法中添加我们需要的代码,然后让其他方法为空即可vclass QuitWindow implements WindowListenervvpublic void windowClosing(WindowEvent evt)vvSystem.exit(0);v v vvoid windowOpened(WindowEvent evt)vvoid windowClosed(WindowEvent evt)vvoid windowIconified(WindowEvent evt)vvoid windowDeiconified(WindowEvent evt)vvoid windowActivated(WindowEvent evt)vvoid windowDeactivated(WindowEvent evt)v java.awt.event包中的另外一个类WindowAdapter实现了有7个空方法的这个接口,但没有任何操作,通过创建WindowAdapter类的子类,可以重载希望处理的和用户操作事件相关的方法。
下面给出用WindowAdatper类的子类ExitFrameg来实现框架程序的关闭Import java.awt.event.*;Class ExitFrame extends WindowsAdapter public void windowClosing(WindowEvent e)System.exit(0);ExitFrame类国为继承了WindowAdapter类,所以实现了WindowListener接口,这样ExitFrame类的对象就可以用于监视框架,而这个类只有一个任务,就是等待关闭窗口System.exit(0)的功能是关闭正在运行的程序如果程序因为某些错误关闭,则参数是其他整型值v可以看到新编写的ExitFrame类还没有和框架程序类MyFrame建立联系,也就是说没有把事件监听器注册到框架中,可以通过在ExitFrame类的构造方法中调用addWindowListener()方法来建立联系:ExitFrame ef=new ExitFrame();this.addWindowListener(ef);通过上面的介绍,就完成了窗口的建立、执行程序和退出程序的操作。
创建一个空框架的完整代码如下:v例:显示一个空框架例:显示一个空框架vimport java.awt.*;v import java.awt.event.*;v public class MyFrame extends Framev v public MyFrame(String str)v v super(str);v addWindowListener(new ExitFrame();v setSize(300,200);v setBackground(Color.yellow);v setVisible(true);v v public static void main(String args)v v MyFrame mf=newMyFrame(My FirstFrame);v v vclass ExitFrame extends WindowAdaptervv public void windowClosing(WindowEvent evt)v v Frame frm=(Frame)evt.getSource();v frm.setVisible(false);v frm.dispose();v System.exit(0);v v例:框架外观的设置 v 设置具有以下特征的框架:它的高度和宽度为整个屏幕的1/3;自定义窗口的标题和背景;窗口的大小不可变。
import java.awt.*;import java.awt.event.*;public class FrameSizeSet extends Frame public FrameSizeSet()addWindowListener(new Wadapt();setTitle(框架外观框架外观);/设置标题设置标题 setBackground(Color.yellow);/设置背景设置背景 Toolkit tk=Toolkit.getDefaultToolkit();/获得屏幕的相关尺寸获得屏幕的相关尺寸 Dimension screenSize=tk.getScreenSize();int screenHeight=screenSize.height;int screenWidth=screenSize.width;/设置框架的尺寸,大小不可调设置框架的尺寸,大小不可调 setSize(screenWidth/3,screenHeight/3);setResizable(false);setVisible(true);public static void main(String args)FrameSizeSet frm=new FrameSizeSet();class Wadapt extends WindowAdapter public void windowClosing(WindowEvent evt)Frame frm=(Frame)evt.getSource();frm.setVisible(false);frm.dispose();System.exit(0);1.文本编辑区文本编辑区v文本编辑区(TextField或TextArea),可以接受用户的文本输入,并有一定的编辑功能,如退格,块复制,块粘贴等。
vTextField类提供了多种构造方法:vpublic TextField()vpublic TextField(int columns):指定能容纳字符的个数vPublic TextField(String text):指定初始化文本vPublic TextField(String text,int columns)向框架中添加其它组件(awt)创建TextArea的方法与TextField的方法相似,除了在指定文本区大小时既要指定文本区的列数又要给出文本区的行数外,其它是完全相同的,构造方法:vpublic TextArea()vpublic TextField(int rows,int columns):指定能容纳字符的个数vPublic TextField(String text):指定初始化文本vPublic TextField(String text,int rows,int columns)v如:TextField textField=new TextField(我是TextField类文本框!,60);TextArea textArea=new TextArea(我是TextArea类文本框!);add(textField);add(textArea);vTextField类中的常用方法:vPublic int getColumns()vPublic String getText()vPublic void setText(String t)vTextArea类中常用方法vPublic void append(String str)vPublic int getColumns()vPublic void insert(String str,int pos)vPublic setRows(int rows)vPublic setColumns(int cols)v文本框和文本区的事件响应文本框除了继承它们父类的事件类型,如TextEvent,KeyEvent,MouseEvent等外,还可以产生一个ActionEvent事件,当向文本框中键入信息并按下Enter键后,就会发生该事件。
为了响应该事件,必须实现相应的监听器接口ActionListener,并为文本框注册监听器,然后通过对ActionListener接口中的actionPerformed()方法的实现来完成对事件的处理文本区与文本框相同的是可以接收继承你类的多种事件,但由于它是多行的,所以按Enter键不会产生事件,此时可以在文本区旁边设置一个按钮,通过按钮的单击事件来完成相应的操作当文本区的内容发生改变时会产生相应的TextEvent事件,相应的事件监听器为TextListener,通过addTextListener()方法注册,当文本区内容改变时,会调用监听器接口中相应的方法textValueChanged(TextEvent e)来处理v例:创建一个文本框和文本区,当文本框中发生ActionEvent事件时,把非空的文本框内容换行追加到文本区中,然后清空文本框import java.awt.*;import java.awt.event.*;public class MyText implements ActionListenerstatic TextField text1;static TextArea text2;public static void main(String args)Frame f=new Frame();text1=new TextField(,20);text2=new TextArea(,4,30);f.add(text1);f.add(text2);text1.addActionListener(new MyText();f.setLayout(new FlowLayout();f.setBounds(0,0,300,150);f.setVisible(true);vpublic void actionPerformed(ActionEvent e)vif(!(text1.getText().equals()vtext2.append(text1.getText()+”n”);vtext1.setText();vvvvv稍作修改vimport java.awt.*;vimport java.awt.event.*;vpublic class MyText extends Frame implements ActionListenervstatic TextField text1;v static TextArea text2;v public MyText()vsuper(文本框示例);vtext1=new TextField(,20);vtext2=new TextArea(,4,30);vadd(text1);v add(text2);vtext1.addActionListener(this);vthis.setLayout(new FlowLayout();vsetBounds(0,0,300,150);vsetVisible(true);vvpublic static void main(String args)vMyText my=new MyText();vvvvpublic void actionPerformed(ActionEvent e)vif(!(text1.getText().equals()vtext2.append(text1.getText();vtext1.setText();vvvv2.复选框复选框v有“选中”和“未选中”两种状态,任何时候都只能处于这两种状态之一,支持二选一的操作。
不同的Checkbox对象之间不排斥,允许用户选中任意多个Checkbox对象创建复选框的构造方法有:public Checkbox():创建不带标签的复选框public Checkbox(String label):创建带标签的复选框public Checkbox(String label,boolean state):创建带标签的复选框且指定选择状态,true表示选中,false表示未选中v如:Checkbox checkbox1=new Checkbox(北京);Checkbox checkbox2=new Checkbox(上海);add(checkbox1);add(checkbox2);v在对复选框对象操作时,常用的方法有:vpublic String getLabel()vpublic void setLabel(String label)vpublic boolean getState()vpublic void setState(boolean state)v复选框的事件响应:复选框的事件响应:复选框类响应的主要事件是项目事件,即ItemEvent事件,单击复选框就是发生ItemEvent事件,ItemEvent事件对应的监听接口是ItemListener,在接口中只有一个方法itemStateChanged(ItemEvent e).在有多个事件源时,正确判断事件源的方法是EventObject类中的getSource(),也可以用ItemEvent类中的getItem()方法得到复选框的标签字符串来确定事件源确定事件源后,可以用getState()方法来判断当前事件源对象表示的选择状态,从而设计相应的功能代码3.单选按钮单选按钮v单选按钮(CheckboxGroup),是一组Checkbox的集合,每个Checkbox对象对应着一种可能的取值情况,即对应一个选项。
CheckboxGroup支持用户“多选一”的输入,按钮之间是互斥的(即如果一个被选中,其它都无法选中)vCheckboxGroup类提供了一个方法来创建复选按钮组,Public CheckboxGroup()vCheckboxGroup类提供的用来管理复选按钮组的常用方法有:vPublic Checkbox getSelectedCheckbox():得到当前选中的复选按钮vPublic void setSelectedCheckbox(Checkbox box):设置被选中的复选按钮对象v创建单选按钮的方法有:Public Checkbox(String label,boolean state,CheckboxGroup group)Public Checkbox(String label,CheckboxGroup group,booean state)v其中,label是单选按钮的标签名,该按钮属于复选按钮组group,state是初始时按钮的状态,最后一个被加入的状态为true的复选按钮对象在复选按钮组显示时被默认选 中v要把一个复选按钮对象加入复选框组对象中,既可以在创建复选按钮时加入,也可以用setCheckboxGroup(CheckboxGroup g)方法实现v如:CheckboxGroup checkboxGroup=new CheckboxGroup();Checkbox checkbox3=new Checkbox(是);Checkbox checkbox4=new Checkbox(否);add(checkbox3);add(checkbox4);checkbox3.setCheckboxGroup(checkboxGroup);checkbox4.setCheckboxGroup(checkboxGroup);单选按钮的事件响应v单选按钮的事件响应同复选框,单击时,相应的项目事件被调用,在事件处理方法itemStateChanged(ItemEvent e)中,利用ItemEvent类的getSource()方法返回所选择的单选按钮的对象名v程序举例:单复选按钮的实现vimport java.awt.*;vimport java.awt.event.*;vpublic class MyCheck implements ItemListenervstatic TextField text1;vstatic Checkbox check1;vstatic Checkbox check2;vstatic Checkbox check3;vpublic static void main(String args)vFrame f=new Frame(Hello);vtext1=new TextField(Please cont。