Java语言程序设计电子课件 第7章 Java事件处理模型_第1页
Java语言程序设计电子课件 第7章 Java事件处理模型_第2页
Java语言程序设计电子课件 第7章 Java事件处理模型_第3页
Java语言程序设计电子课件 第7章 Java事件处理模型_第4页
Java语言程序设计电子课件 第7章 Java事件处理模型_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA语言程序设计7.1事件处理机制7.2事件处理机制案例7.3AWT工具集和Swing组件7.4图形用户界面布局管理本章小结第一章目录教学目标:图形用户界面((GraphicsUserInterface,GUI)是为应用程序提供的一个图形化界面,使用户与应用程序之间的交互更加简单、有效。因此,图形用户界面的设计与开发已经成为软件开发中的一项重要工作。本章将介绍图形用户界面的制作,目前在移动终端软件开发方面,特别是Android系统上的应用软件的开发,中国人是走在世界前列的。教学重点:1.掌握事件处理机制和主要的事件类。2.掌握布局管理器的应用。3.掌握AWT组件和Swing组件。4.了解Swing特殊组件的应用。第七章7.1.1Java事件处理模型7.1事件处理机制

事件对象组件(事件源)监听器注册监听器产生事件将事件对象传给监听器处理事件源.addXxxListener(监听器对象);1.事件三要素事件:用户在界面上的操作。事件源:产生事件的组件。

监听器:是一个专门用于处理事件的类。它接收事件,并产生相应的动作。如果希望某一个事件源能够产生反应,要事先为其注册相应的监听器。2.事件处理编程步骤第一步:程序引入java.awt.event包。第二步:编写监听器,该监听器要实现相应的监听接口。第三步:为事件源注册监听器。注册监听器的方法为:事件源.addXxxListener(监听器对象),其中

XxxListener为不同的监听接口。importjava.awt.*;importjava.awt.event.*;publicclassExample7_1{//创建公共类 publicstaticvoidmain(String[]args){ newButtonPress(); }}classButtonPressimplementsActionListener{//创建事件处理器类 Framef=newFrame("第一个事件处理示例"); Buttonb=newButton("请按下"); publicButtonPress(){//设计GUI f.setSize(300,200); f.setBackground(Color.yellow); f.setLayout(newFlowLayout()); f.add(b); b.addActionListener(this);//为按钮注册监听器 f.setVisible(true); } publicvoidactionPerformed(ActionEvente){//事件处理器类实现的方法,当单击按钮时,窗口颜色由黄色变为红色 f.setBackground(Color.red); }}【例7-1】界面上有一个按钮,当左键单击按钮后窗口颜色由黄色变为红色。

图7-1界面为黄色图7-2左键单击按钮后界面为红色主要事件类和事件监听器3.事件适配器事件适配器是一个实现相应事件接口的类,它实现接口中的每个方法,但方法中不做任何处理。监听器通过继承事件适配器,将实现的方法继承过来,并重写需要的方法即可。Java语言为每个包含多个方法的事件接口都提供了对应的事件适配器。

序号事件类型事件接口事件适配器1ActionEventActionListener无2ComponentEventComponentListenerComponentAdapter3ContainerEventContainerListenerContainerAdapter4AdjustmentEventAdjustmentListener无5ItemEventItemListener无6KeyEventKeyListenerKeyAdapter7MouseEventMouseListenerMouseAdapter8MouseEventMouseLMotionListenerMouseLMotionAdapter9TextEventTextListenerTextAdapter10WindowEventWindowListenerWindowAdapter11FocusEventFocusListenerFocusAdapter事件接口和事件类型对应表7.1.2三种常用的事件ActionEvent类对应的是动作事件,主要发生在鼠标左键点击按钮、选择菜单项、选择列表项、文本框或文本域内输入回车符时。该类对应的监听器接口为ActionListener。ItemEvent是项目事件,主要发生在单击单选按钮或勾选复选框而改变选项时。ItemEvent类对应的监听器接口为ItemListener。

WindowEvent类对应的是窗口事件,主要发生在窗口被激活、关闭、最小化、恢复等操作时。对应的监听器接口为WindowListener。

其他常用事件ItemEvent事件MouseEvent事件KeyEvent事件FocusEvent事件AdjustmentEvent事件importjava.awt.*;importjava.awt.event.*;publicclassExample7_3{ publicstaticvoidmain(String[]args){ newWindowEventDemo(); }}classWindowEventDemoextendsFrameimplementsWindowListener{ Framef=newFrame("窗口事件"); publicWindowEventDemo(){ f.setSize(300,200); f.setVisible(true); f.addWindowListener(this); } publicvoidwindowActivated(WindowEvente){} publicvoidwindowClosed(WindowEvente){} publicvoidwindowClosing(WindowEvente){ System.exit(0);//退出系统 } publicvoidwindowDeactivated(WindowEvente){} publicvoidwindowDeiconified(WindowEvente){} publicvoidwindowIconified(WindowEvente){} publicvoidwindowOpened(WindowEvente){}}【例7-3】创建窗口,点击标题栏中的按钮,实现窗体的关闭。

importjava.awt.*;importjava.awt.event.*;publicclassExample7_4{ publicstaticvoidmain(String[]args){ newWindowAdapterDemo(); }}classWindowAdapterDemoextendsWindowAdapter{//继承窗口适配器 Framef=newFrame("窗口适配器"); publicWindowAdapterDemo(){ f.setSize(300,200); f.setVisible(true); f.addWindowListener(this); //注册窗口监听器 } publicvoidwindowClosing(WindowEvente){ System.exit(0); //退出系统 }}【例7-4】用事件适配器完成窗口关闭功能

监听器实现的不同方法7.1.3内部类实现监听器

类实现本类组件的监听器内部类实现监听器匿名类实现监听器

【例7-5】在文本框中输入一个数字,点击“平方”按钮计算该数字的平方值,点击“立方”按钮计算该数字的立方值,并对窗口的关闭按钮进行监听。importjava.awt.*;importjava.awt.event.*;publicclassExample7_5{ Framef=newFrame("内部类实现监听器"); Labell=newLabel("请输入一个数字"); TextFieldt1=newTextField(8); TextFieldt2=newTextField(8); Buttonb1=newButton("平方"); Buttonb2=newButton("立方"); publicExample7_5(){//构造方法设置GUI f.setSize(300,200); f.setLayout(newFlowLayout()); f.add(l); f.add(t1); f.add(t2); f.add(b1); f.add(b2); b1.addActionListener(newHandler1());//平方计算注册给内部类 b2.addActionListener(newActionListener(){//立方值计算注册给匿名类 publicvoidactionPerformed(ActionEvente){ Stringnumber=t1.getText(); intn=Integer.parseInt(number); intm=n*n*n; t2.setText("立方为"+m); } }); f.addWindowListener(newHandler3()); f.setVisible(true); } publicstaticvoidmain(String[]args){//程序运行 newExample7_5(); } classHandler1implementsActionListener{//内部类监视器计算平方值 publicvoidactionPerformed(ActionEvente){ Stringnumber=t1.getText(); intn=Integer.parseInt(number); intm=n*n; t2.setText("平方为"+m); } } classHandler3extendsWindowAdapter{//内部类监视器关闭窗口 publicvoidwindowClosing(WindowEvente){ System.exit(0); } }} 在社会上,有的人大学毕业后月入才几千元,而有的人初中毕业却能够买车买房,所以,有的同学认为读书投入了时间和学费,却不能得到更高的回报。为什么要多读书,人民日报给出了最好的答案:读书的意义是使人虚心通达,不固执、不偏执;书中未必有黄金屋但一定有更好的自己;读书让你哪怕身陷泥泞也依然可以仰望星空;书或许不能解决眼下的难题但它会给你冲破困难的力量;读书就是让自己变得辽阔的过程。读书学习就是读经验、学知识,就是学习社会的运转逻辑,更深刻地理解整个社会。学习可以扩充我们的知识面,帮助我们打开通往成功的大门。我们不能增加生命的长度,但是能通过读书增加生命的宽度和厚度。课后思考:工资与读书投入真的可以计算性价比吗?

7.2.1鼠标拖动小球游戏7.2事件处理案例

(1)创建窗体对象f、面板对象p、显示一个直径为30像素的红色小球。(2)为小球注册鼠标的监听事件(3)创建一个鼠标监听器类实现鼠标移动监听接口(4)在鼠标监听器的鼠标移动方法中,获取鼠标当前位置,然后在鼠标的位置重新将小球画出来。实现鼠标拖动小球的工作。1.设计思路(1)如何注册鼠标监听器?(2)如何判断当前鼠标的位置?【解决问题1】首先让面板类实现鼠标监听器接口,然后为面板类对象p注册一个鼠标拖动的监听器,也就是自身。p.addMouseMotionListener(p);【解决问题2】在鼠标监听器中,有固定的方法获取鼠标当前位置。鼠标事件e通过getX()方法,可以获得鼠标当前位置的X轴坐标;鼠标事件e通过getY()方法,可以获得鼠标当前位置的Y轴坐标;因此鼠标的当前位置(x,y)可以由以下方法得到。x=e.getX();y=e.getY();2.遇到问题importjava.awt.*;importjava.awt.event.*;publicclassMoveBall{ publicstaticvoidmain(Stringargs[]){ Framew=newFrame(); w.setSize(300,400); MyPanelp=newMyPanel(); p.addMouseMotionListener(p);//鼠标拖动 w.addWindowListener(newCloseWin());//关闭按钮 w.add(p); w.setVisible(true);}}3.程序实现classMyPanelextendsPanelimplementsMouseMotionListener{ intx=30; inty=30; publicvoidpaint(Graphicsg){ g.setColor(Color.red);//设置小球为红色 g.fillOval(x,y,30,30);//绘制一个直径为30像素的球 } publicvoidmouseDragged(MouseEvente){ x=e.getX();//获取鼠标所在的坐标位置 y=e.getY(); repaint();//重画界面 } publicvoidmouseMoved(MouseEvente){}}classCloseWinextendsWindowAdapter//创建窗体监听器{ publicvoidwindowClosing(WindowEvente){ System.exit(0);//退出系统 }}7.2.2弹球游戏

(1)创建窗体对象frame,在窗体上绘制一个小球。(2)通过循环控制小球的横、纵坐标在窗体宽度和高度范围内按当前移动方向变化。(3)引入线程,通过线程控制小球的移动,在小球撞墙的那一刻,改变小球移动方向。(4)当小球撞击界面的下边缘时,判定木棒是否接住了小球。如果接住了,小球正常弹回,如果没有接住,游戏结束。1.设计思路(1)如何画一个木棒?(2)如何判定木棒接住了小球?(3)如何结束程序,显示gameover?【解决问题1】通过绘制一个矩形,实现在界面上画出一个木棒。设置矩形的长度和高度,显示木棒的长短和粗细。g.fillRect(xp,yp,w,h);【解决问题2】通过设置一个布尔型的变量flag,判断每次小球撞击下边界的位置是否在木棒出现的范围内。如果正好在区域内,说明木棒接住了小球,布尔值flag为真,否则,木棒没有接住小球,布尔值flag为假。2.遇到问题if(小球左边界+直径>=木棒的起始位置&&小球左边界<=木棒的右边界) {小球正常弹回;} else{ flag=false;用break结束循环; }【解决问题3】在paint()方法中,每次判定flag的值是否为假,如果为假,显示字符串GameOverif(flag==false){ g.setFont(newFont("",Font.BOLD,40)); g.drawString("gameover",50,50); }2.遇到问题importjava.awt.Color;importjava.awt.Font;importjava.awt.Frame;importjava.awt.Graphics;importjava.awt.Panel;importjava.awt.event.*;publicclassMarblesGame{ publicstaticvoidmain(String[]args){ Framef=newFrame(); MyPanelp=newMyPanel(); Threadt=newThread(p); p.addKeyListener(p); f.addKeyListener(p);//添加键盘事件 f.addWindowListener(newWindowAdapter(){ @Override//匿名类实现窗体监听接口 publicvoidwindowClosing(WindowEvente){ //TODOAuto-generatedmethodstub System.exit(0); } }); t.start();//启动线程 f.setSize(500,550); f.add(p); f.setVisible(true);//窗口可见 }}3.程序实现classMyPanelextendsPanelimplementsRunnable,KeyListener{ privateintx=20; privateinty=20;//小球出现的起始位置 privateintxp=200; privateintyp=448;//木棒出现的起始位置 privateintw=60; privateinth=16;//木棒的长度和高度 privatebooleanflag=true; publicvoidpaint(Graphicsg){ g.fillOval(x,y,20,20); g.setColor(Color.red);//木棒颜色为红色 g.fillRect(xp,yp,w,h);//用矩形画出木棒 if(flag==false){//如果没接住小球,程序结束 g.setFont(newFont("",Font.BOLD,40)); g.drawString("gameover",50,50); } }

publicvoidrun(){ intix=2; intiy=4; while(true){//小球四个方向进行弹球 if(y+20>=yp){ if(x+20>=xp&&x<=xp+w)

iy=-iy; else{

flag=false; break; } } if(y<=0){ iy=-iy; } if(x>=462||x<=0){ ix=-ix; } x+=ix; y+=iy; try{Thread.sleep(100);//线程休眠100毫秒 }catch(Exceptione){ e.printStackTrace(); } repaint();//重画界面 } } @Override publicvoidkeyPressed(KeyEvente){//在键盘按下方法中实现木棒移动 intkc=e.getKeyCode(); if(kc==37||kc=='a'){ xp-=10;//如果是左箭头或者字母a键,木棒向左移动 }elseif(kc==39||kc=='d'){ xp+=10;//如果是右箭头或者字母d键,木棒向右移动 } repaint(); } publicvoidkeyReleased(KeyEvente){ } publicvoidkeyTyped(KeyEvente){}}美国断芯可能会给中兴带来困难,甚至造成中兴倒闭,然而对于拥有世界上最完整工业体系的中国来说,岂是谁断货就能休克得了的。从空间站、探月、北斗导航、通讯卫星、高清探测遥感卫星、气象卫星、广播电视卫星、量子通讯卫星、鹊桥号中继星,悟空暗物质探测卫星,到洲际弹道导弹、关岛快递东风26航母杀手、舰舰导弹、空地导弹、反导系统、反隐身雷达、以及水下飞行器;从歼20、运20、直20、预警机、察打一体无人机、世界首款第六代无人隐身战斗机,到战略导弹核潜艇、万吨级驱逐舰、航母、深潜技术、电磁炮、电磁推进和电磁弹射技术、深潜技术、乘波体高超音速飞行器、以及现代化的两弹;凡是世界上有的主要工业产业,中国都有,而且大部分都已经达到或接近世界先进水平。我们既要承认差距,也要充满自信,我们既要树立远大目标,也要脚踏实地从当下做起。课后阅读:中国人要敢于正视差距,但更要自信。7.3.1AWT工具集简介7.3AWT工具集和Swing组件

1.组件组件(Component)是Java的图形用户界面的最基本的组成部分。Java把Component类的子类或间接子类创建的对象成为一个组件,如Button、List、TextField、Label等。组件以图形化的方式显示在屏幕上,并能通过对不同事件的响应来完成和用户的交互或组件之间的交互。组件不能单独的显示出来,必须将组件放在一定的容器中才可以显示。

2.容器容器(Container)也是一个类,Java把Container的子类或间接子类创建的对象称为一个容器。由于Container也是Component的子类,因此容器本身也是一个组件,具有组件的所有性质。但容器最主要的功能是容纳其他组件和容器。3.布局管理器布局管理器(LayoutManager)对应着java.awt包中的一个类,可以为每一个容器设置一个布局管理器,从而为该容器中的组件进行定位。4.事件事件(Event)是java.awt包中的类。在Java中,程序和用户的交互是通过响应各种事件来实现的。当用户按下一个按钮,意味着一个按钮事件的发生;用户在文本框中输入文本后按Enter键,意味着一个动作事件的发生。每当事件发生时,Java虚拟机就会将事件的消息传递给程序,由程序中的事件处理方法对该事件进行处理。有上述的四个概念可知,当设计一个图形界面时应分为四个步骤:(1)创建容纳组件的容器(2)为容器设置布局管理器(3)将组件按照布局的方式添加在容器中(4)处理组件上发生的事件7.3AWT工具集和Swing组件

7.3.2Swing组件7.3AWT工具集和Swing组件

在AWT的基础上构建的一套新的图形用户界面系统,采用纯Java语言编写,包含AWT所提供的所有功能。这些Swing组件位于javax.swing包中,成为JDK基础类库的一部分。它不依赖于本地操作系统的图形用户界面,可以做到跨平台运行。绝大多数的Swing组件派生自JCompomnent类,Swing组件的类层次结构如图7-11所示。顶层容器包括JFrame、JApplet、JDialog。(1)JFrameJFrame类用于创建Swing窗口对象。它的用法与Frame用法类似。但是二者最大的区别是,JFrame不能直接通过add()方法加入组件,也不能直接通过setLayout()方法设置布局。1.顶层容器第一步:获取窗口的内容面板JFramejf=newJFrame();Containerc=jf.getContentPane();第二步:对内容面板设置布局(Container的默认布局是BorderLayout)c.setLayout(newFlowLayout());//设置顺序布局第三步:将组件加入到内容面板JButtonjb=newJButton(“ok”);c.add(jb);//加入一个按钮在空白窗口中添加组件的步骤:

importjavax.swing.*; importjava.awt.*; importjava.awt.event.*; publicclassExample7_6{ JFramejf=newJFrame("第一个Swing窗口示例"); JButtonjb=newJButton("我是一个按钮"); publicExample7_6(){ jf.setBounds(100,100,300,200);//设置窗口的位置和尺寸 jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);

//设置窗口的关闭按钮为可响应的 Containerc=jf.getContentPane();//获取内容面板 c.setLayout(newFlowLayout());//设置内容面板布局 c.add(jb);//在内容面板添加按钮组件 jf.setVisible(true); //jf.pack();//若有此句则窗口为紧缩模式 } publicstaticvoidmain(String[]args){newExample7_6(); } }【例7-6】JFrame窗口示例(2)JAppletjavax.swing.JApplet是java.awt.Applet的子类,是用来建立Java小应用程序的。JApplet和JFrame一样,都要获取内容面板,为内容面板设置布局方式,将组件放置在内容面板中。importjavax.swing.*;importjava.awt.*;publicclassExample7_7extendsJApplet{ JButtonjb=newJButton("我是一个按钮"); publicvoidinit(){//JApplet和Applet一样没有main方法 this.setSize(300,200); Containerc=this.getContentPane();//为JApplet获得内容面板 c.setLayout(newFlowLayout()); c.add(jb); c.setCursor(newCursor(Cursor.HAND_CURSOR));//鼠标设置为手型 }}【例7-7】JApplet窗口示例。(3)JDialogJDialog是对话框类,是从一个窗口中弹出的窗口。对话框是应用广泛的组件之一,它不能作为应用程序的主窗口,也没有最小化、最大化按钮,不能设置菜单栏。importjava.awt.event.*;importjava.awt.*;importjavax.swing.*;publicclassExample7_8implementsActionListener{ JFramejf=newJFrame("对话框示例"); JDialogjd=newJDialog(jf,"对话框",true);//定义一个对话框,设置为有模式状态,一旦对话框被激活则无法再激活它所依赖的窗口。 JButtonjb1=newJButton("打开"); JButtonjb2=newJButton("关闭"); publicExample7_8(){ jf.setSize(300,200); jd.setSize(100,100);//设置对话框的尺寸 Containerc=jf.getContentPane(); c.setLayout(newFlowLayout()); c.add(jb1); c.add(jb2); //为两个按钮添加监视器 jb1.addActionListener(this); jb2.addActionListener(this); jf.setVisible(true);

}【7-8】JDialog窗口示例。 publicvoidactionPerformed(ActionEvente){ if(e.getSource()==jb1){//点击”打开“按钮时,对话框可见 jd.setVisible(true); } else{ jd.setVisible(false);//点击”关闭“按钮时,对话框消失 } } publicstaticvoidmain(String[]args){ newExample7_8(); }}中间容器不能作为顶层容器,必须包含在其它容器中,包括JPanel、JScrollPane、JtabbedPane、JToolBar。面板JPanel是最灵活、最常用的中间容器,用于容纳其它组件。对应于javax.swing.JPanel类。面板可以方便的布局,实现嵌套。面板的大小由它所包含的组件决定,默认布局是FlowLayout。2.中间容器1.JComponent类JComponent类是除顶层容器外所有Swing组件的父类。2.标签JLabelJLabel是一个用户组件,提供文本或图像信息。对应于javax.swing.JLabel类。标签不能被编辑,不能对输入事件作出反应,因此它无法获得键盘焦点。3.按钮JButton按钮JButton是常见组件,按钮上允许有图标或字符串,也可以两者兼有,最常见的操作是单击按钮。对应于javax.swing.JButton类。7.3.4SWING中的组件importjava.awt.*;importjavax.swing.*;publicclassExample7_11{ JFramejf=newJFrame("标签示例"); JLabeljl1=newJLabel("圣诞快乐");//生成文本标签 JLabeljl2=newJLabel(newImageIcon("f:\\chapter8\\Christmas.gif"));//生成图片标签 publicExample7_11(){ jf.setSize(300,200); Containerc=jf.getContentPane(); c.setLayout(newFlowLayout()); jl1.setFont(newFont("黑体",Font.BOLD,40));//设置字体 c.add(jl1); c.add(jl2); jf.setVisible(true); } publicstaticvoidmain(String[]args){ newExample7_11(); }}【例7-11】利用标签显示文本和图片(1)JTextField(单行文本框)单行文本框TextField,允许编辑或输入单行文本,对应于javax.swing.JTextField类。该类常用事件是ActionEvent和FocusEvent事件。(2)JPassword(密码框)密码框JPassword是JTextField的子类,组件与文本框组件类似。区别在于密码框回显字符一律以特定符号显示。常用事件为ActionEvent事件。(3)JTextArea(多行文本区)多行文本区(JTextArea)与文本框组件类似,区别是文本区组件可以显示多行文本。常用事件为ActionEvent。4.JTextField、JPassword、JTextAreaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassExample7_12{ JFramejf=newJFrame("密码框示例"); JPasswordFieldjpf=newJPasswordField(8); JLabeljl=newJLabel(); publicExample7_12(){ jf.setSize(300,100); Containerc=jf.getContentPane(); c.setLayout(newFlowLayout()); jpf.setEchoChar('#'); c.add(jpf); c.add(jl); jpf.addActionListener(newHandler()); jf.setVisible(true); } classHandlerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ jl.setText("您输入的密码是:"+jpf.getText()); } } publicstaticvoidmain(String[]args){ newExample7_12(); }}【例7-12】密码框组件的使用,在界面的密码框中输入密码,以#显示,输入回车后,在界面上提示刚才输入的密码。(1)JCheckBox复选框JCheckBox是一个小框,当选择某个复选框后,里面就有了个小对号。复选框的名字不仅可以是字符串也可以是一个图标。常用事件是ItemEvent。(2)JRadioButton单选按钮JRadioButton和复选框很类似。不同的是,在若干个复选框中可以同时选中多个,而一组单选钮同一时刻只能有一个被选中。当创建了若干个单选按钮后,应该使用ButtonGroup再创建一个对象,然后利用这个对象把这若干个单选按钮归组。单选钮常用事件为ItemEvent。5.复选框JCheckBox、单选按钮JRadioButtonimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassExample7_13implementsItemListener{ JFramejf=newJFrame("选择按钮示例"); //创建单选按钮 JRadioButtonjr1=newJRadioButton("男"); JRadioButtonjr2=newJRadioButton("女"); //创建复选款 JCheckBoxjcb1=newJCheckBox("音乐"); JCheckBoxjcb2=newJCheckBox("旅游"); JCheckBoxjcb3=newJCheckBox("游戏"); JButtonb=newJButton("确定"); JLabeljl1=newJLabel("个人信息统计"); JLabeljl2=newJLabel(); StringBuffers1=newStringBuffer("个人信息如下----性别:"); StringBuffers2=newStringBuffer("爱好:"); publicExample7_13(){ jf.setSize(300,200); Containerc=jf.getContentPane(); c.setLayout(newFlowLayout()); c.add(jl1);

【例7-13】单选按钮和复选框的使用,在界面中选择个人信息,点击“确定”按钮,显示用户刚才的选择。 ButtonGroupbg=newButtonGroup();//单选按钮分组 //将两个单选按钮jr1、jr2 bg.add(jr1); bg.add(jr2); //将两个单选按钮三个复选款添加到面板中 c.add(jr1); c.add(jr2); c.add(jcb1); c.add(jcb2); c.add(jcb3); c.add(b); c.add(jl2); b.addActionListener(newHandleButton()); //为单选钮和复选框添加监视器 jr1.addItemListener(this); jr2.addItemListener(this); jcb1.addItemListener(this); jcb2.addItemListener(this); jcb3.addItemListener(this); jf.setVisible(true); }

publicvoiditemStateChanged(ItemEvente){//单选钮和复选款监视器 if(e.getSource()==jr1){//组件被选中 if(jr1.isSelected()){ s1.append(jr1.getText()); } } if(e.getSource()==jr2){ if(jr2.isSelected()){ s1.append(jr2.getText()); } } if(e.getSource()==jcb1){ if(jcb1.isSelected()){s2.append(jcb1.getText()); } } if(e.getSource()==jcb2){ if(jcb2.isSelected()){s2.append(jcb2.getText()); } } if(e.getSource()==jcb3){ if(jcb3.isSelected()){s2.append(jcb3.getText()); } } } publicstaticvoidmain(String[]args){ newExample7_13(); } classHandleButtonimplementsActionListener{//按钮监视器 publicvoidactionPerformed(ActionEvente){ jl2.setText(s1.toString()+s2.toString()); } }}(1)JComboBox下拉列表框JComboBox,可以给出若干选项,只允许用户选择一项。下拉列表能节省空间,使界面更加紧凑。在单击箭头时才能浏览其中的项目。下拉列表的常用事件为ActionEvent和ItemEvent。(2)JList列表框JList,与下拉列表有许多不同之处,支持单项选择也支持多项选择。如果选项特别多,可以把JList放置在JScrollPane面板上,提供有滚动条的列表。当用户在列表框中选择一些项时,将触发ListSelectionEvent事件(该事件在javax.swing.event包中),ListSelectionListener监视器负责处理该事件,实现的方法为publicvoidvalueChanged(ListSelectionEvente)。6.下拉列表框JComboBox、列表框JListimportjava.awt.*;importjavax.swing.*;importjava.awt.event.*;publicclassExample7_14implementsItemListener{ Stringselect[]={"香蕉","菠萝","苹果","柚子"};//下拉列表选项数组 JFramejf=newJFrame("下拉列表框示例"); JComboBoxjcb=newJComboBox(select);//创建下拉列表 JLabeltitle=newJLabel("请选择您喜欢的水果:"); JLabeljl=newJLabel();publicExample7_14(){ jf.setSize(300,200); Containerc=jf.getContentPane(); c.setLayout(newFlowLayout());

【7-14】下拉列表框示例 title.setFont(newFont("黑体",Font.BOLD,28));//设置字体 c.add(title); c.add(jcb); jcb.addItemListener(this);//为下拉列表注册监视器 c.add(jl); jf.setVisible(true);} publicvoiditemStateChanged(ItemEvente){ //监视器实现jl.setText("您选择的是:"+jcb.getSelectedItem().toString());//获取选项 } publicstaticvoidmain(String[]args){ newExample7_14(); }}importjava.awt.*;importjavax.swing.*;importjavax.swing.event.*;//事件所在包publicclassExample7_15implementsListSelectionListener{ JFramejf=newJFrame("列表框示例"); Stringselect[]={"香蕉","菠萝","苹果","柚子"};// JLabeljl1=newJLabel("请选择您喜欢的水果:"); JLabeljl2=newJLabel(); JListjlist=newJList(select);//创建列表,列表项来自select数组publicExample7_15(){ jf.setSize(300,200); Containerc=jf.getContentPane(); c.setLayout(newFlowLayout()); c.add(jl1); c.add(jlist);

【7-15】列表框例题 c.add(jl2); jlist.addListSelectionListener(this);//为列表注册监视器 jf.setVisible(true); } publicvoidvalueChanged(ListSelectionEvente){ StringBuffers=newStringBuffer();//创建缓冲字符串 Objectobj[]; obj=jlist.getSelectedValues();//获得多个选项,返回值为object数组 for(inti=0;i<obj.length;i++){ s.append(obj[i].toString()+"");//将数组值逐个取出转为String类型,逐个追加 } jl2.setText("您选择了:"+s); } publicstaticvoidmain(String[]args){ newExample7_15(); }}菜单是图形用户界面常用的一种组件,主要有两种形式:一种是基于菜单条的,一般加在JFrame组件上,一种是单击右键的弹出式菜单。(1)菜单条菜单菜单条菜单由三部分组成:菜单(JMenu)、菜单条(JMenuBar)、菜单项(JMenuItem)。上述三者的关系是:JMenu必须放在一个JMenuBar上,JMenuItem必须放在一个JMenu上,JMenu的子项可以是JMenu、JMenuItem和分隔符。(2)弹出式菜单JPopupMenu弹出式菜单是一种特殊形式的菜单,其性质与菜单几乎相同。但是弹出式菜单并不固定在窗口的任何一个位置,而是由鼠标和系统判断决定位置。弹出式菜单发生在用户按下或松开鼠标右键时触发MouseEvent事件。7.菜单JMenu7.4.1顺序布局顺序布局(FlowLayout)是最基本的一种布局,对应于java.awt.FlowLayout类。Panel及其子类的默认布局方式均为顺序布局。顺序布局是指根据显示区域的大小,把组件按照从左到右的顺序排列,一行排满后就转到下一行继续排列,直到把所有组件都显示出来。在顺序布局方式下,组件使用容器的add方法将自己加入容器中。7.4图形用户界面布局管理importjava.awt.*;publicclassExample7_17{ publicstaticvoidmain(String[]args){ Framef=newFrame("顺序布局示例"); Buttonb1=newButton("按钮1"); Buttonb2=newButton("按钮2"); Buttonb3=newButton("按钮3"); Buttonb4=newButton("按钮4"); Buttonb5=newButton("按钮5"); f.setSize(300,200); f.setLayout(newFlowLayout());//设置窗口的布局为顺序布局 f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5); f.setVisible(true); }}【例7-17】使用顺序布局放5个按钮边界布局(BorderLayout)是一种简单的布局策略,对应于java.awt.BorderLayout类。Window及其子类(Frame、Dialog)的默认布局方式均为边界布局。边界布局将一个容器分为5个部分:东、南、西、北、中。这几部分的分布规律是“上北下南,左西右东”。东南西北四个边界内的组件占据了它们所需的尽可能多的空间,中间区域则占据了剩余的全部空间。每加入一个组件都应该指明把这个组件加在哪个区域中,区域由BorderLayout中的静态常量CENTER、NORTH、SOUTH、WEST、EAST表示。7.4.2边界布局importjava.awt.*;publicclassExample7_18{ publicstaticvoidmain(String[]args){ Framef=newFrame("边界布局示例"); f.setSize(300,200); Buttoneast=newButton("东"); Buttonsouth=newButton("南"); Buttonwest=newButton("西"); Buttonnorth=newButton("北"); Buttoncenter=newButton("中"); BorderLayoutbor=newBorderLayout();//创建边界布局对象 f.setLayout(bor);//为窗口设置边界布局 //将五个按钮按照方向依次放入窗口对应的五个区域 f.add("East",east); f.add("South",south); f.add("West",west); f.add("North",north); f.add("Center",center); f.setVisible(true); }}【7-18】使用边界布局放置5个按钮组件网格布局(GridLayout)是一种使用较多的布局,对应于java.awt.GridLayout类。网格布局是指将一个容器分成若干个网格,将组件安放到网格的行和列中。组件首先被添加到网格的第一行的第一个单元,向右继续排列。当第一行内所有的单元都被占满时,下一个组件被添加到网格第二行的第一个单元,以此类推。7.4.3网格布局importjava.awt.*;publicclassExample7_19{ publicstaticvoidmain(String[]args){ Framef=newFrame("网格布局示例"); GridLayoutgri=newGridLayout(3,3);//3行3列的网格 f.setSize(300,200); f.setLayout(gri); for(inti=1;i<=9;i++){ f.add(newButton("按钮"+i)); } f.setVisible(true); }}【7-19】创建一个具有3行3列的网格卡片布局(CardLayout)可以容纳多个组件。对应于java.awt.CardLayout类。卡片布局是指将组件像卡片一样叠放起来,在任何时候只有一张卡片是可见的,就像一叠“扑克牌”一样,这个被显示的组件将占据容器的整个空间。7.4.4卡片布局假设有容器f,使用CardLayout的步骤如下:(1)创建CardLayout对象作为布局,如:CardLayoutcard=newCardLayout();(2)容器使用setLayout方法设置布局,如:f.setLayout(card);(3)容器调用add(Strings,Componentb)方法将组件b加入到容器中。其中,s是该组件的代号。f.add(“按钮1”,b);(4)使用CardLayout提供的show、first等方法,显示组件。importjava.awt.*;publicclassExample7_20{ publicstaticvoidmain(String[]args){ Framef=newFrame("卡片布局"); CardLayoutcard=newCardLayout(10,5);

//设置卡片布局,水平间距为10,垂直间距为5 Buttonb1=newButton("1号卡片"); Buttonb2=newButton("2号卡片"); Buttonb3=newButton("3号卡片"); f.setSize(300,200); f.setLayout(card); f.add("1",b1);//将b1加入f中,设置代号为"1" f.add("2",b2);//将b2加入f中,设置代号为"2" f.add("3",b3);//将b3加入f中,设置代号为"3" card.show(f,"2");//卡片布局显示第二张卡片 f.setVisible(true); }}【7-20】创建一个卡片布局,并显示第二张卡片首先用户先进行登录,通过服务器的验证,登录到服务器上。显示当前在线的用户,双击某个用户名,可以与该用户互相发送信息,发送文件。当某个用户退出登录后,在其他用户列表上显示该用户不在线。7.5图形用户界面案例(1)在工程的src文件夹中创建p1文件夹,分别创建三个java文件,登录界面Chat_Login.java、联系人界面Chat_Contact.java、聊天界面Chat_Main.java。(2)登录界面Chat_Login.java的窗体布局整体采用边界布局,用户名、密码组件放置在面板p1中,并将p1放在窗体的Center位置,将三个按钮放在面板p2中,并将P2放在面板的South位置。(3)为两个按钮注册监听器。当点击“登录”按钮时,将用户名、密码与先前设定的值进行比较,匹配则显示信息成功,否则显示信息失败。当点击“取消”按钮,退出系统。(4)联系人界面Chat_Contact.java的窗体布局整体采用边界布局。分为北边和中间两部分。分别放置两个面板p1和p2。P1采用流布局,只放置一个“联系人:”按钮;P2采用网格布局,3行1列,放置3个联系人按钮。(5)聊天界面Chat_Main.java的窗体整体采用边界布局,中间部分放一个JTextArea组件,在南边的位置放一个面板p。面板p采用网格布局,1行2列,依次放JTextField组件和JButton组件。1.设计思路(1)点击登录按钮后,如果登录成功,如何显示联系人界面?(2)联系人是如何添加到联系人界面上的?(3)点击一个联系人a2,如何弹出聊天界面?2.遇到问题【解决问题1】当登录成功后,创建联系人界面Chat_Contact的对象wmain,设置该对象可见,同时让登录界面不可见。Chat_Contactwmain=newChat_Contact(); wmain.setVisible(true); this.setVisible(false);【解决问题2】正常情况下,联系人应该从数据库中提取,现在先用一个JLabel的数据显示a1、a2和a3三个标签来代替。到第十章,再修改这部分代码。同时给每个按钮注册监听器。for(inti=0;i<3;i++){ jl[i]=newJLabel(); jl[i].setText("a"+(i+1)); jl[i].addMouseListener(this);}【解决问题3】在鼠标点击事件中,判断如果点击了标签,创建聊天界面Chat_Main的对象cm,设置该对象可见。if(e.getSource()==jl[i]){ Chat_Maincm=newChat_Main(username); cm.setName(jl[i].getText()); cm.setVisible(true); } packagep1;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassChat_LoginextendsJFrameimplementsActionListener{ JTextFieldtuser=newJTextField();JPasswordFieldtpass=newJPasswordField(); publicChat_Login(){//搭建窗体界面 this.setSize(260,120);//指定大小 this.setLocation(300,300); JPanelJtext=newJPanel();//添加文本框面板Jtext; Jtext.setLayout(newGridLayout(2,2)); JLabelluser=newJLabel("用户名:"); JLabellpass=newJLabel("密码:"); Jtext.add(luser); Jtext.add(tuser);//添加用户名,密码组件 Jtext.add(lpass); Jtext.add(tpass); JPanelJbutton=newJPanel();//添加按钮面板Jbutton; JButtonblogin=newJButton("登录"); JButtonbreg=newJButton("注册"); JButtonbcancel=newJB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论