Java课件 第9章学习资料_第1页
Java课件 第9章学习资料_第2页
Java课件 第9章学习资料_第3页
Java课件 第9章学习资料_第4页
Java课件 第9章学习资料_第5页
已阅读5页,还剩117页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1第9章图形用户界面郑莉2目录9.1Applet概述9.2Applet应用程序接口9.3绘图9.4Swing基础9.5Swing的特点和概念9.6Swing组件9.7其它Swing特性9.8桌面API9.9本章小结(说明:本章部分例题出自java_tutorial_sun)39.1Applet概述JavaApplet一种嵌入HTML文档中的Java程序与Application相比,Applet具有明显的优点web浏览器提供了运行Applet所需要的许多功能Applet是在运行时通过网络从服务器端下载的,因而便于软件的发布和及时更新Applet也有其局限性,不能在客户机上读写当地文件也不能连接除它所在的服务器以外的其它机器4在浏览器中加载一个Applet,功能是显示一个字符串“ThisisaJavaApplet!”importjava.awt.Graphics;importjavax.swing.JApplet;publicclassMyApplet

extendsJApplet{publicvoidpaint(Graphicsg){//重载JApplet类的paint方法

//参数是Graphics类的对象,是由浏览器传递过来的

super.paint(g);//调用其超类JApplet类的paint方法

g.drawString("ThisisaJavaApplet!",25,25);}}9.1Applet概述(续)

——例9-15在NetBeansIDE中运行9.1Applet概述(续)

——例9-1运行结果6编译MyApplet.java产生字节码文件MyApplet.class。接下来就需要编写一个HTML文件MyApplet.html来嵌入MyApplet.class<html><appletcode="MyApplet.class"width="300"height="45"></applet></html>将MyApplet.html文件和MyApplet.class文件放在同一个目录下。现在,在浏览器中打开这个HTML文件,当浏览器遇到Applet标记时,就会自动载入指定的class文件,就会实现在屏幕上绘制一串字符的效果9.1Applet概述(续)

——例9-1运行结果79.2Applet应用程序接口方法调用时机和用途publicvoidinit()当浏览器(即Applet容器)载入某个Applet时,容器会自动创建这个Applet类的一个实例,并调用它的init方法8publicvoidstart()init方法执行结束之后,自动调用这个方法。另外,当浏览器用户在访问另一个网址之后重新返回applet所在的HTML页时,将再次调用start方法publicvoidpaint(Graphicsg)start方法启动后调用此方法,另外每次需要重绘applet时也将调用该方法。程序通常不直接调用paintpublicvoidrepaint()在响应用户和Applet的交互时经常要用到。通常只是调用,而不重写这个方法。对于轻量级组件,它调用组件的paint方法,对重量级组件它调用组件的update方法,由update调用paintpublicvoidstop()用户离开Applet所在的HTML页时调用该方法,它执行挂起Applet所需的所有任务,例如停止动画和线程publicvoiddestroy()用户关闭浏览器窗口,Applet将从内存中移走的时候调用该方法9.2Applet应用程序接口(续)99.2Applet应用程序接口JApplet类JApplet类属于新的Swing组件一个applet程序需要继承javax.swing包中的JApplet类或AWT组件中的Applet类,提供了applet在浏览器中运行需要具备的特定方法浏览器载入时,要依次运行init、start、paint方法离开浏览器页面时,执行stop退出浏览器时,执行destroy提供了所有这些方法的默认实现,在编写applet时,只要继承这个JApplet,然后重写特定的方法来增加特殊功能10在Japplet窗口中显示标签importjavax.swing.*;.importjava.awt.*;publicclassHelloSwingAppletextendsJApplet{publicvoidinit(){JLabellabel=newJLabel("YouaresuccessfullyrunningaSwingapplet!");label.setHorizontalAlignment(JLabel.CENTER);label.setBorder(BorderFactory.createMatteBorder(1,1,2,2,Color.black));

getContentPane().add(label,BorderLayout.CENTER);}}9.2Applet应用程序接口(续)

——HelloSwingApplet.java119.3绘图图形环境和图形对象颜色和字体使用Graphics类绘图使用Graphics2D类绘图129.3.1图形环境和图形对象坐标GUI组件的左上角坐标默认为(0,0)从左上角到右下角,水平坐标x和垂直坐标y增加。坐标的单位是象素Graphics对象专门管理图形环境。Graphics类是一个抽象类抽象类Graphics提供了一个与平台无关的绘图接口各平台上实现的Java系统将创建Graphics类的一个子类,来实现绘图功能,但是这个子类对程序员是透明的在执行paint方法时,系统会传递一个指向特定平台的Graphics子类的图形对象g9.3绘图139.3.2颜色和字体Java中有关颜色的类是Color类,它在java.awt包中,声明了用于操作颜色的方法和常量名称描述publicfinalstaticColorGREEN常量绿色publicfinalstaticColorRED常量红色publicColor(intr,intg,intb)通过指定红、蓝、绿颜色分量(0~255),创建一种颜色publicintgetRed()返回某颜色对象的红色分量值(0~255)Graphics:publicvoidsetColor(Colorc)Graphics类的方法,用于设置组件的颜色Graphics:publicColorgetColor()Graphics类的方法,用于获得组件的颜色9.3绘图149.3.2颜色和字体Font类——有关字体控制,在java.awt包中名称描述publicfinalstaticintPLAIN一个代表普通字体风格的常量publicfinalstaticintBOLD一个代表黑体字体风格的常量publicfinalstaticintITALIC一个代表斜体字体风格的常量publicFont(Stringname,intstyle,intsize)利用指定的字体、风格和大小创建一个Font对象publicintgetStyle()返回一个表示当前字体风格的整数值publicBooleanisPlain()测试一个字体是否是普通字体风格Graphics:publicFontgetFont()获得当前字体Graphics:publicvoidsetFont(Fontf)设置当前字体为f指定的字体、风格和大小9.3绘图159.3.3使用Graphics类绘图Graphics类其对象可以绘制文本、线条、矩形、多边形、椭圆、弧等多种图形名称描述publicvoiddrawString(Stringstr,intx,inty)绘制字符串,左上角的坐标是(x,y)publicvoiddrawLine(intx1,inty1,intx2,inty2)在(x1,y1)与(x2,y2)两点之间绘制一条线段publicvoiddrawRect(intx,inty,intwidth,intheight)用指定的width和height绘制一个矩形,该矩形的左上角坐标为(x,y)publicvoidfillRect(intx,inty,intwidth,intheight)用指定的width和height绘制一个实心矩形,该矩形的左上角坐标为(x,y)9.3绘图16publicvoidclearRect(intx,inty,intwidth,intheight)用指定的width和height,以当前背景色绘制一个实心矩形。该矩形的左上角坐标为(x,y)publicvoiddrawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)用指定的width和height绘制一个圆角矩形,圆角是一个椭圆的1/4弧,此椭圆由arcWidth、arcHeight确定两轴长。其外切矩形左上角坐标为(x,y)publicvoidfillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)用当前色绘制实心圆角矩形,各参数含义同drawRoundRect。publicvoiddraw3DRect(intx,inty,intwidth,intheight,booleanb)用指定的width和height绘制三维矩形,该矩形左上角坐标是(x,y),b为true时,该矩形为突出的,b为false时,该矩形为凹陷的。publicvoidfill3DRect(intx,inty,intwidth,intheight,booleanb)用当前色绘制实心三维矩形,各参数含义同draw3DRect。9.3绘图17publicvoiddrawPolygon(int[]

xPoints,int[]yPoints,intnPoints)用xPoints,yPoints数组指定的点的坐标依次相连绘制多边形,共选用前nPoints个点。publicvoidfillPolygon(int[]xPoints,int[]yPoints,intnPoints)绘制实心多边形,各参数含义同drawPolygon。publicvoiddrawOval(intx,inty,intwidth,intheight)用指定的width和height,以当前色绘制一个椭圆,外切矩形的左上角坐标是(x,y)。publicvoidfillOval(intx,inty,intwidth,intheight)绘制实心椭圆,各参数含义同drawOval。publicvoiddrawArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)绘制指定width和height的椭圆,外切矩形左上角坐标是(x,y),但只截取从startAngle开始,并扫过arcAngle度数的弧线。publicvoidfillArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)绘制一条实心弧线(即扇形),各参数含义同drawArc9.3绘图18用各种颜色绘制文字及各种图形importjava.awt.*;importjavax.swing.*;publicclassGraphicsTesterextendsJFrame{publicGraphicsTester(){super(“演示字体、颜色、绘图”);//调用基类构造方法

setVisible(true);//显示窗口

setSize(480,250);//设置窗口大小

}publicvoidpaint(Graphicsg){super.paint(g);//callsuperclass'spaintmethodg.setFont(newFont("SansSerif",Font.BOLD,12));g.setColor(Color.blue);//设置颜色

g.drawString("字体ScanSerif,粗体,12号,蓝色",20,50);

9.3.3使用Graphics类绘图(续)

——例9-29.3绘图19g.setFont(newFont("Serif",Font.ITALIC,14));g.setColor(newColor(255,0,0));g.drawString("字体Serif,斜体,14号,红色",250,50);

g.drawLine(20,60,460,60);//绘制直线

g.setColor(Color.green);g.drawRect(20,70,100,50);//绘制空心矩形

g.fillRect(130,70,100,50);//绘制实心矩形

g.setColor(Color.yellow);g.drawRoundRect(240,70,100,50,50,50);//绘制空心圆角矩形

g.fillRoundRect(350,70,100,50,50,50);//绘制实心圆角矩形

g.setColor(Color.cyan);g.draw3DRect(20,130,100,50,true);//绘制突起效果空心矩形

g.fill3DRect(130,130,100,50,false);//绘制凹陷效果实心矩形9.3绘图9.3.3使用Graphics类绘图(续)

——例9-220g.setColor(Color.pink);g.drawOval(240,130,100,50);//绘制空心椭圆

g.fillOval(350,130,100,50);//绘制实心椭圆

g.setColor(newColor(0,120,20));g.drawArc(20,190,100,50,0,90);//绘制一段圆弧

g.fillArc(130,190,100,50,0,90);//绘制扇形

g.setColor(Color.black);int

xValues[]={250,280,290,300,330,310,320,290,260,270};intyValues[]={210,210,190,210,210,220,230,220,230,220};g.drawPolygon(xValues,yValues,10);//绘制空心多边形

intxValues2[]={360,390,400,410,440,420,430,400,370,380};g.fillPolygon(xValues2,yValues,10);//绘制实心多边形

}

9.3绘图9.3.3使用Graphics类绘图(续)

——例9-221publicstaticvoidmain(Stringargs[]){GraphicsTesterapplication=newGraphicsTester();application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}运行结果9.3绘图9.3.3使用Graphics类绘图(续)

——例9-2运行结果229.3.4使用Graphics2D类绘图Java2DAPI提供了高级的二维图形功能分布在java.awt、java.awt.image、java.awt.color、java.awt.font、java.awt.geom、java.awt.print和java.awt.image.renderable包中它能轻松使你完成以下功能:绘制任何宽度的直线用渐变颜色和纹理来填充图形平移、旋转、伸缩、切变二维图形,对图像进行模糊、锐化等操作构建重叠的文本和图形9.3绘图23Graphics2D类是Graphics类的抽象子类要使用Java2DAPI,就必须建立该类的对象事实上,传递给paint方法的对象是Graphics2D的一个子类实例,被向上转型为Graphics类的实例。要访问Graphics2D功能,必须将传递给paint方法的Graphics引用强制转换为Graphics2D引用:Graphics2Dg2d=(Graphics2D)g9.3.4使用Graphics2D类绘图(续)9.3绘图24实现例9-1的功能,使用Java2D使文字出现渐变色效果importjava.awt.*;importjavax.swing.*;publicclassGraphics2DTesterextendsJApplet{publicvoidpaint(Graphicsg){super.paint(g);

Graphics2Dg2d=(Graphics2D)g;g2d.setPaint(newGradientPaint(0,0,Color.red,180,45,Color.yellow));g2d.drawString("ThisisaJavaApplet!",25,25);}}9.3绘图9.3.4使用Graphics2D类绘图(续)

——例9-3259.3绘图9.3.4使用Graphics2D类绘图(续)

——例9-3运行结果269.4Swing基础前面介绍了如何在屏幕上绘制普通的图形,但如果需要绘制一个按钮,并使其可以对点击事件作出响应,就需要使用javaSwing提供的组件其实前面我们已经用到的JFrame、JApplet都是Swing组件,它们分别代表窗口组件和Applet容器组件279.4.1JFC与SwingJFCJavaFoundationClasses(Java基础类)的缩写是关于GUI组件和服务的完整集合作为J2SE的一个有机部分,主要包含5个部分AWTJava2DAccessibilityDrag&DropSwingSwingJFC的一部分提供按钮、窗口、表格等所有的组件纯Java组件(完全用Java写的)9.4Swing基础289.4.2Swing与AWT早期版本的AWT组件在java.awt包里,包括Button、Checkbox、Scrollbar等,都是Component类的子类大部分含有nativecode,所以随操作系统平台的不同会显示出不同的样子,而不能进行更改,是重量级组件(heavyweightcomponents)没有弹性、缺乏效率9.4Swing基础29较新的Swing组件其名称都是在原来AWT组件名称前加上J,例如JButton、JCheckBox、JScrollbar等,都是JComponent类的子类Java1.2推出,架构在AWT之上,是AWT的扩展而不是取代完全是由java语言编写的,其外观和功能不依赖于任何由宿主平台的窗口系统所提供的代码,是轻量级组件(lightweightcomponents)可提供更丰富的视觉感受,被越来越多地使用9.4.2Swing与AWT9.4Swing基础30在Applet中应用Swing,就是要将Swing组件加载到Applet容器上(通常是JApplet),这通常在init方法中完成在Application中应用Swing,也是要将Swing组件加载到这个Application的顶层容器(通常是JFrame)中9.4Swing基础9.4.3在Applet和Application中应用Swing31应用Swing组件的Appletimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassSwingAppletextendsJApplet{publicvoidinit(){ContainercontentPane=getContentPane();

contentPane.setLayout(newGridLayout(2,1));

JButtonbutton=newJButton("Clickme");

finalJLabellabel=newJLabel();

contentPane.add(button);

contentPane.add(label);button.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){

Stringinformation=JOptionPane.showInputDialog("请输入一串字符");label.setText(information);

}

});//创建监听器语句结束

}//init方法结束}9.4Swing基础9.4.3在Applet和Application中应用Swing

(续)

——例9-4329.4Swing基础9.4.3在Applet和Application中应用Swing

(续)

——例9-4运行结果33把JApplet换成JFrame,将例9-4的程序改为Applicationimportjavax.swing.*;importjava.awt.event.*;importjava.awt.*;publicclassSwingApplication{publicstaticvoidmain(String[]args){JFramef=newJFrame(“SimpleSwingApplication”);ContainercontentPane=f.getContentPane();contentPane.setLayout(newGridLayout(2,1));JButtonbutton=newJButton("Clickme");finalJLabellabel=newJLabel();contentPane.add(button);//添加按钮

contentPane.add(label);//添加标签

button.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){

Stringinformation=JOptionPane.showInputDialog("请输入一串字符");label.setText(information);}});f.setSize(200,100);//设置大小

f.show();//显示

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}9.4Swing基础9.4.3在Applet和Application中应用Swing

(续)

——例9-5349.4Swing基础9.4.3在Applet和Application中应用Swing

(续)

——例9-5运行结果359.5Swing的特点和概念

SwingGUI组件javax.swing包源于AWT(packagejava.awt)的组件包括外观和感觉外观以及用户如何和程序交互轻量级组件完全用Java写成,不是用当前平台的GUI功能某些Swing组件也是重量级的,外观和功能受到本地窗口系统的限制,如java.awt.Windows的子类java.applet.Applet的子类369.5.1Swing的组件和容器层次

绝大多数Swing组件的继承层次9.5Swing的特点和概念379.5.1Swing的组件和容器层次(续)JComponent类是除了顶层容器以外所有Swing组件的基类,根据继承关系,我们可以在每个基类中找到大多数GUI组件的常见操作Component类包含paint、repaint方法,可以在屏幕上绘制组件大多数GUI组件直接或间接扩展ComponentContainer类容纳相关组件包括add方法,用来添加组件包括setLayout方法,这个方法可用来设置布局,以帮助Container对象对其中的组件进行定位和设置组件大小JComponent类——多数Swing组件的超类可抽换的外观和感觉,即可根据需求定制外观和感觉。快捷键(通过键盘直接访问GUI组件)一般的事件处理功能9.5Swing的特点和概念38通常将javax.swing包里的Swing组件归为三个层次顶层容器中间层容器原子组件9.5.1Swing的组件和容器层次(续)9.5Swing的特点和概念39顶层容器Swing提供三个顶层容器的类JFrame

实现单个主窗口JDialog

实现一个二级窗口(对话框)JApplet在浏览器窗口中实现一个applet显示区域必须和操作系统打交道,所以都是重量级组件从继承结构上来看,它们分别是从原来AWT组件的Frame、Dialog和Applet类继承而来每个使用Swing组件的Java程序都必须至少有一个顶层容器,别的组件都必须放在这个顶层容器上才能显现出来9.5Swing的特点和概念9.5.1Swing的组件和容器层次(续)

——顶层容器40中间层容器其存在的目的仅仅是为了容纳别的组件分为两类一般用途的JPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar特殊用途的JInternalFrameJRootPane可以直接从顶层容器中获得一个JRootPane对象来直接使用,而别的中间容器使用的时候需要新建一个对象9.5Swing的特点和概念9.5.1Swing的组件和容器层次(续)

——中间层容器41原子组件通常是在图形用户界面中和用户进行交互的组件基本功能是和用户交互信息,而不像前两种组件那样是用来容纳别的组件的根据功能的不同,可被分为三类显示不可编辑信息的JLabel、JProgressBar、JToolTip有控制功能、可以用来输入信息的JButton、JCheckBox、JRadioButton、JComboBox、JList、JMenu、JSlider、JSpinner、JTexComponent等能提供格式化的信息并允许用户选择的JColorChooser、JFileChooser、JTable、JTree9.5Swing的特点和概念9.5.1Swing的组件和容器层次(续)

——原子组件42三层容器结构示例importjavax.swing.*;importjava.awt.*;publicclassComponentTester{publicstaticvoidmain(String[]args){JFrame.setDefaultLookAndFeelDecorated(true);JFrameframe=newJFrame("SwingFrame");ContainercontentPane=frame.getContentPane();JPanelpanel=newJPanel();panel.setBorder(BorderFactory.createLineBorder(Color.black,5));panel.setLayout(newGridLayout(2,1));JLabellabel=newJLabel("Label",SwingConstants.CENTER);JButtonbutton=newJButton("Button");panel.add(label);panel.add(button);

contentPane.add(panel);frame.pack();//对组件进行排列

frame.show();//显示

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}9.5Swing的特点和概念9.5.1Swing的组件和容器层次(续)

——例9-643程序说明首先创建一个JFrame类顶级容器然后获得顶级容器的内容面板contentPane,只有通过它才能加入其他组件。然后创建一个JPanel类的中间容器panel,并设置边框以及布局然后创建原子组件Label,button,并将它们添加到中间容器上然后将中间容器通过内容面板添加到顶层容器上,并/对组件进行排列9.5Swing的特点和概念9.5.1Swing的组件和容器层次(续)

——例9-6运行结果449.5Swing的特点和概念9.5.1Swing的组件和容器层次(续)

——Swing组件列表459.5.2布局管理如何将下级组件有秩序地摆在上一级容器中在程序中具体指定每个组件的位置使用布局管理器(InterfaceLayoutManager)布局管理器调用容器对象的setLayout方法,并以布局管理器对象为参数,例如:ContainercontentPane=frame.getContentPane();contentPane.setLayout(newFlowLayout());使用布局管理器可以更容易地进行布局,而且当改变窗口大小时,它还会自动更新版面来配合窗口的大小,不需要担心版面会因此混乱9.5Swing的特点和概念469.5.2布局管理(续)在Java中有很多实现LayoutManager接口的类,经常用到的有以下几个BorderLayoutFlowLayoutGridLayoutCardLayoutGridBagLayoutBoxLayoutSpringLayout上一节提到的内容面板(contentpane)默认使用的就是BorderLayout,它可以将组件放置到五个区域:东、西、南、北、中9.5Swing的特点和概念47在该例中,引用了SUN公司提供的几个的示例程序,演示了布局管理器的使用方法和效果BorderLayoutDemo.java及其运行效果BorderLayout以将组件放置到五个区域:东、西、南、北、中9.5.2布局管理(续)

——例9-79.5Swing的特点和概念48FlowLayoutDemo.javaFlowLayout是JPanel默认使用的布局管理器,它只是简单地把组件放在一行,如果容器不是足够宽来容纳所有组件,就会自动开始新的一行9.5Swing的特点和概念9.5.2布局管理(续)

——例9-749GridLayoutDemo.javaGridLayout将按照其构造方法中程序员提供的行数和列数将界面分为等大的若干块,组件被等大地按加载顺序放置其中9.5Swing的特点和概念9.5.2布局管理(续)

——例9-750CardLayoutDemo.javaCardLayout可以实现在一个区域出现不同的组件布局,就像在一套卡片中选取其中的任意一张一样。它经常由一个复选框控制这个区域显示哪一组组件,可通过组合框像选择卡片一样选择某一种布局9.5Swing的特点和概念9.5.2布局管理(续)

——例9-751GridBagLayoutDemo.javaGridBagLayout把组件放置在网格中,这一点类似于GridLayout,但它的优点在于不仅能设置组件摆放的位置,还能设置该组件占多少行/列。这是一种非常灵活的布局管理器9.5Swing的特点和概念9.5.2布局管理(续)

——例9-752BoxLayoutDemo.javaBoxLayout将组件放在单一的行或列中,和FlowLayout不同的是,它可以考虑到组件的对齐方式,最大、最小、优选尺寸9.5Swing的特点和概念9.5.2布局管理(续)

——例9-753SpringDemo.javaSpringLayout是一种灵活的布局管理器。它能够精确指定组件之间的间距。组件之间的距离通过Spring类的对象来表示,每个spring有四个属性,最小值,最大值,优选值和实际值。每个组件的spring对象集合在一起就构成了SpringLayout.Constraints对象9.5Swing的特点和概念9.5.2布局管理(续)

——例9-7549.5.3事件处理GUI是由事件驱动的,一些常见的事件包括:移动鼠标单双击鼠标各个按钮单击按钮在文本字段输入在菜单中选择菜单项在组合框中选择、单选和多选拖动滚动条关闭窗口……Swing通过事件对象来包装事件,程序可以通过事件对象获得事件的有关信息9.5Swing的特点和概念559.5Swing的特点和概念9.5.3事件处理(续)

——Swing组件的时间对象56编写事件处理程序时,要注意三个概念事件源与用户进行交互的GUI组件,表示事件来自于哪个组件或对象比如要对按钮被按下这个事件编写处理程序,按钮就是事件源事件监听器负责监听事件并做出响应一旦它监视到事件发生,就会自动调用相应的事件处理程序作出响应事件对象封装了有关已发生的事件的信息例如按钮被按下就是一个要被处理的事件,当用户按下按钮时,就会产生一个事件对象。事件对象中包含事件的相关信息和事件源9.5Swing的特点和概念9.5.3事件处理(续)

——事件处理机制的三个部分57程序员应完成的两项任务为事件源注册一个事件监听器实现事件处理方法9.5Swing的特点和概念9.5.3事件处理(续)

——程序员应完成的两项任务58事件源提供注册监听器或取消监听器的方法维护一个已注册的监听器列表,如有事件发生,就会通知每个已注册的监听器一个事件源可以注册多个事件监听器,每个监听器又可以对多种事件进行相应,例如一个JFrame事件源上可以注册窗口事件监听器,响应窗口关闭窗口最大化窗口最小化鼠标事件监听器,响应鼠标点击鼠标移动9.5Swing的特点和概念9.5.3事件处理(续)

——事件源59事件监听器是一个对象,通过事件源的add×××Listener方法被注册到某个事件源上不同的Swing组件可以注册不同的事件监听器一个事件监听器中可以包含有对多种具体事件的专用处理方法例如用于处理鼠标事件的监听器接口MouseListener中就包含有对应于鼠标压下、放开、进入、离开、敲击五种事件的相应方法mousePressed、mouseReleased、mouseEntered、mouseExited、mouseClicked,这五种方法都需要一个事件对象作为参数9.5Swing的特点和概念9.5.3事件处理(续)

——事件监听器60通常我们用到的事件对象有ActionEvent发生在按下按钮、选择了一个项目、在文本框中按下回车键ItemEvent发生在具有多个选项的组件上,如JCheckBox、JComboBoxChangeEvent用在可设定数值的拖曳杆上,例如JSlider、JProgressBar等WindowEvent用在处理窗口的操作MouseEvent用于鼠标的操作9.5Swing的特点和概念9.5.3事件处理(续)

——事件对象61事件源事件对象事件监听器JFrameMouseEventWindowEventMouseEventListenerWindowEventListenerAbstractButton(JButton,JToggleButton,JCheckBox,JRadioButton)ActionEventItemEventActionListenerItemListenerJTextFieldJPasswordFieldActionEventUndoableEventActionListenerUndoableListenerJTextAreaCareEventInputMethodEventCareListenerInputMethodEventListenerJTextPaneJEditorPaneCareEventDocumentEventUndoableEventHyperlinkEventCareListenerDocumentListenerUndoableListenerHyperlinkListener9.5Swing的特点和概念9.5.3事件处理(续)

——Swing事件源可能触发的事件及事件监听器62JComboBoxActionEventItemEventActionListenerItemListenerJListListSelectionEventListDataEventListSelectionListenerListDataListenerJFileChooserActionEventActionListenerJMenuItemActionEventChangeEventItemEventMenuKeyEventMenuDragMouseEventActionListenerChangeListenerItemListenerMenuKeyListenerMenuDragMouseListenerJMenuMenuEventMenuListenerJPopupMenuPopupMenuEventPopupMenuListener9.5Swing的特点和概念9.5.3事件处理(续)

——Swing事件源可能触发的事件及事件监听器63JProgressBarChangeEventChangeListenerJSliderChangeEventChangeListenerJScrollBarAdjustmentEventAdjustmentListenerJTableListSelectionEventTableModelEventListSelectionListenerTableModelListenerJTabbedPaneChangeEventChangeListenerJTreeTreeSelectionEventTreeExpansionEventTreeSelectionListenerTreeExpansionListenerJTimerActionEventActionListener9.5Swing的特点和概念9.5.3事件处理(续)

——Swing事件源可能触发的事件及事件监听器64事件监听器接口例如MouseListener是一个接口,为了在程序中创建一个鼠标事件监听器的对象,我们需要实现其所有五个方法,在方法体中,我们可以通过鼠标事件对象传递过来的信息(例如点击的次数,坐标),实现各种处理功能事件监听器适配器类有时我们并不需要对所有事件进行处理,为此Swing提供了一些适配器类×××Adapter,这些类含有所有×××Listener中方法的默认实现(就是什么也不做),因此我们就只需编写那些需要进行处理的事件的方法。例如,如果只想对鼠标敲击事件进行处理,如果使用MouseAdapter类,则只需要重写mouseClicked方法就可以了9.5Swing的特点和概念9.5.3事件处理(续)

——Swing事件源可能触发的事件及事件监听器65实现事件监听器接口这种方法需要实现接口中所有的方法,对我们不需要进行处理的事件方法,也要列出来,其方法体使用一对空的花括号继承事件监听器适配器类只需要重写我们感兴趣的事件使用匿名内部类特别适用于已经继承了某个父类(例如Applet程序,主类必须继承JApplet类或Applet类),则根据java语法规则,就不能再继承适配器类的情况,而且使用这种方法程序看起来会比较清楚明了9.5Swing的特点和概念9.5.3事件处理(续)

——三种实现事件处理的方法66创建一窗口,当鼠标在窗口中点击时,在窗口标题栏中显示点击位置坐标。方法一:实现MouseListener接口importjava.awt.event.*;//载入MouseListener类所在的包importjavax.swing.*;//载入JFrame所在的包publicclassImplementMouseListenerimplementsMouseListener{JFramef;publicImplementMouseListener(){f=newJFrame();//新建一窗口

f.setSize(300,150);f.show(); f.addMouseListener(this);//为窗口增加鼠标事件监听器

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicvoidmousePressed(MouseEvente){}publicvoidmouseReleased(MouseEvente){}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}

publicvoidmouseClicked(MouseEvente){f.setTitle("点击坐标为("+e.getX()+","+e.getY());}publicstaticvoidmain(String[]args){newImplementMouseListener();}}9.5Swing的特点和概念9.5.3事件处理(续)

——例9-8_167继承MouseAdapter类importjava.awt.event.*;//载入MouseAdapter所在的包importjavax.swing.*;publicclassExtendMouseAdapter

extendsMouseAdapter{JFramef;publicExtendMouseAdapter(){f=newJFrame();f.setSize(300,150);f.show();f.addMouseListener(this);f.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);}

publicvoidmouseClicked(MouseEvente){f.setTitle("点击坐标为("+e.getX()+","+e.getY()+")");}publicstaticvoidmain(String[]args){newExtendMouseAdapter();}}9.5Swing的特点和概念9.5.3事件处理(续)

——例9-8_268方法三:使用匿名内部类importjava.awt.event.*;importjavax.swing.*;publicclassUseInnerClass{JFramef;publicUseInnerClass(){f=newJFrame();f.setSize(300,150);f.show();f.addMouseListener(newMouseAdapter(){publicvoidmouseClicked(MouseEvente){f.setTitle("点击坐标为("+e.getX()+","+e.getY()+")");

}});//为窗口添加鼠标事件监听器语句结束

f.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});//为窗口添加窗口事件监听器语句结束

}publicstaticvoidmain(String[]args){newUseInnerClass

();}}9.5Swing的特点和概念9.5.3事件处理(续)

——例9-8_369采用三种不同方法的程序,其运行效果都是一样的,当鼠标在窗口中点击的时候,窗口标题栏将出现所点位置的坐标信息9.5.3事件处理(续)

——例9-8运行结果709.6Swing组件组件和容器容器层次结构是一个以顶层容器为根的树状组件集合为了显示在屏幕上,每个组件必须是一套容器层次结构的一部分每个组件只能放置在某个容器内一次如果某个组件已经在一个容器中,又将它加到另外一个容器中,这个组件就会从第一个容器中清除719.6.1顶层容器Swing提供了3个顶层容器类:JFrameJAppletJDialog都是重量级组件,分别继承了AWT组件Frame、Applet和Dialog每个顶层容器都有一个内容面板,通常直接或间接的容纳别的可视组件可以有选择地为顶层容器添加菜单,菜单被放置在顶层容器上,但是在内容面板之外9.6Swing组件72java.lang.Object└java.awt.Component└java.awt.Container└java.awt.Window└java.awt.Frame└javax.swing.JFrame

每个包含Swing组件的主窗口都应用JFrame来实现9.6Swing组件9.6.1顶层容器(续)

——JFrame的继承结构73java.lang.Object└java.awt.Component└java.awt.Container└java.awt.Panel└java.awt.Applet└javax.swing.JApplet

每个包含Swing组件的Applet都应作为JApplet的子类来实现9.6Swing组件9.6.1顶层容器(续)

——JApplet的继承结构74java.lang.Object└java.awt.Component└java.awt.Container└java.awt.Window└java.awt.Dialog└javax.swing.JDialog要实现对话框,需要从JDialog派生一个类9.6Swing组件9.6.1顶层容器(续)

——JDialog的继承结构75JApplet类的顶层容器由浏览器提供,通常我们不需要自己产生一个JApplet类的对象。JFrame和JDialog通过构造方法进行创建名称描述JFrame()建立一个新的JFrame,默认值是不可见的(Invisible)JFrame(Stringtitle)建立一个具有标题title的JFrame,默认值是不可见的(Invisilble)JApplet()建立一个JAppletJDialog()建立一个non-moal对话框,无标题JDialog(Dialogowner)建立一个属于Dialog组件的对话框,为non-modal形式,无标题JDialog(Dialogowner,booleanmodal)建立一个属于Dialog组件的对话框,可决定modal形式,无标题JDialog(Dialogowner,Stringtitle)建立一个属于Dialog组件的对话框,为non-modal形式,有标题9.6Swing组件9.6.1顶层容器(续)

——如何获得一个顶层容器76JDialog(Dialogowner,Stringtitle,booleanmodal)建立一个属于Dialog组件的对话框,可决定modal形式,有标题JDialog(Frameowner)建立一个属于Frame组件的对话框,为non-modal形式,无标题JDialog(Frameowner,booleanmodal)建立一个属于Frame组件的对话框,可决定modal形式,无标题JDialog(Frameowner,Stringtitle)建立一个属于Frame组件的对话框,为non-modal形式,有标题JDialog(Frameowner,Stringtitle,booleanmodal)建立一个属于Frame组件的对话框,可决定modal形式,有标题9.6Swing组件9.6.1顶层容器(续)

——如何获得一个顶层容器77importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassFrameDemo{publicstaticvoidmain(Strings[]){

JFrameframe=newJFrame("FrameDemo");frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});

JLabelemptyLabel=newJLabel("");emptyLabel.setPreferredSize(newDimension(175,100));

frame.getContentPane().add(emptyLabel,BorderLayout.CENTER);frame.pack();frame.setVisible(true);}}9.6Swing组件9.6.1顶层容器(续)

——FrameDemo.java78importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTopLevelDemo{publicstaticvoidmain(Strings[]){

JFrameframe=newJFrame("TopLevelDemo");

frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});

JLabelyellowLabel=newJLabel("");yellowLabel.setOpaque(true);yellowLabel.setBackground(Color.yellow);yellowLabel.setPreferredSize(newDimension(200,180));JMenuBarcyanMenuBar=newJMenuBar();cyanMenuBar.setOpaque(true);cyanMenuBar.setBackground(Color.cyan);cyanMenuBar.setPreferredSize(newDimension(200,20));

frame.setJMenuBar(cyanMenuBar);

frame.getContentPane().add(yellowLabel,BorderLayout.CENTER);frame.pack();frame.setVisible(true);}}9.6Swing组件9.6.1顶层容器(续)

——TopLevelDemo.java79只要显示一段文字,或是做一些简单的选择的简单对话框在javax.swing包内通过使用这个类提供的一些静态方法show×××Dialog,就可以产生四种简单的对话框它们的方法参数中绝大部分(除了输入对话框可以不指定父窗口)都需要提供一个父窗口组件ParentComponent,只有关闭这些简单的对话框后,才可以返回到其父窗口,也就是说,它们绝大部分都是模态的9.6Swing组件9.6.1顶层容器(续)

——JOptionPane.java809.6.2中间层容器中间层容器存在的目的仅仅是为了容纳别的组件,它分为两类一般用途的JPanelJScrollPaneJSplitPaneJTabbedPaneJTool

温馨提示

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

评论

0/150

提交评论