Java语言程序设计基础(第2版)Applet程序设计ppt.ppt_第1页
Java语言程序设计基础(第2版)Applet程序设计ppt.ppt_第2页
Java语言程序设计基础(第2版)Applet程序设计ppt.ppt_第3页
Java语言程序设计基础(第2版)Applet程序设计ppt.ppt_第4页
Java语言程序设计基础(第2版)Applet程序设计ppt.ppt_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

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

文档简介

1,2019/4/14,第六讲 Applet程序设计,2019/4/14,2,学习要点,Applet简介 Applet的生命周期 Applet的HTML标记及属性 Applet的调试器appletviewer的使用 Applet中的GUI Applet的绘图 Applet的多媒体支持 Applet的安全机制,2019/4/14,3,什么是Applet,Java Applet是Java的一种可运行代码。 Java Applet在支持Java虚拟机的浏览器环境中运行。 它是Java与Web相结合而引入的一种重要的Java应用形式 。,2019/4/14,4,Applet与Application,Application和Applet是利用JAVA语言生成的可运行代码中最常用的两种 Application和Applet的区别主要在于执行方式的不同 Application以控制台方式运行,以main()方法作为程序执行的入口 Applet本身不能直接运行,必须嵌入到浏览器中,由浏览器加载执行。,2019/4/14,5,在浏览器中运行Java Applet的优势,真正平台无关 良好的用户界面 可以访问事件处理 可以访问网络环境 增强的图形能力。 良好的安全机制 以上的优势使得Java Applet在构建Client/Server和其他网络应用时有着明显的优势,2019/4/14,6,Java Applet的限制,如果Applet的规模比较大,则它的启动时间很长 Applet在默认的情况下不能访问本地磁盘,2019/4/14,7,Java Applet类,Java中存在两个Applet类: java.applet.Applet类:基于AWT的Java Applet javax.swing.JApplet类:基于Swing的Java Applet类,2019/4/14,8,Applet类和JApplet类的继承关系,2019/4/14,9,Java Applet的创建,基于AWT的Java Applet的创建 import java.applet.*; public class HellowWord extends Applet 基于Swing的Java Applet的创建 import javax.swing.*; pulbic class HellowWord extends JApplet ,2019/4/14,10,Java Applet的基本框架,Applet的基本框架由一套方法组成。 它们提供了浏览器与Applet之间的接口以及二者执行控制的基本机制。 public void init() public void start() public void stop() public void paint(Graphics g) public void destroy(),2019/4/14,11,init()方法,浏览器通过调用init()方法来通知applet它已经被载入,它的调用在start()方法调用之前。 init()方法的典型应用就是构造任何必需的对象,加载applet要求的图片或者创建applet运行要用到的线程。,2019/4/14,12,start()方法,浏览器在调用完init()方法后将自动调用start()方法 当浏览器从图标恢复为窗口时,或者用户离开包含Applet的主页后再又返回时,都会再次执行start()方法 start()为Applet的主体,在其中执行需要重新启动的任务或者重新激活一个线程。,2019/4/14,13,stop()方法,当用户离开Applet所在的页面或浏览器变为图标时,浏览器会自动调用stop()方法 stop()方法的作用在于当用户暂时不需要使用Applet时,停止一些耗用系统资源的工作,避免影响系统的运行速度,2019/4/14,14,destory()方法,当包含Applet的页面被关闭时,浏览器会自动调用destory()方法 destory()方法的作用是回收被Applet所使用同时与系统其他应用无关的内存资源,2019/4/14,15,Java Applet的生命周期,2019/4/14,16,Applet的HTML标记和属性, * ,2019/4/14,17,用于定位Applet代码的属性,CODEBASE 这个可选属性定义Applet的URL基址 CODE: 定义Applet的class名称 ARCHIVE: 定义Applet运行所用到的资源文件 name: 定义Applet的名称,2019/4/14,18,用于规定Applet显示方式的属性,WIDTH和HEIGHT 定义Applet在浏览器中显示时的初始高度和宽度 ALIGN 定义Applet在浏览器中的对齐方式 VSPACE和HSPACE 定义Applet在浏览器中显示时,X方向和Y方向的补白 ALT 定义当浏览器不支持Applet时,显示在Applet标记所在的位置的内容,2019/4/14,19,向Applet传递参数的标记,Applet利用参数标签来定义Applet初始化时的参数。 举例 Applet的参数定义允许用户定制Applet的操作。提高了Applet的灵活性。,2019/4/14,20,Applet参数定义的注意点,Applet参数的名称(即Name属性值)是不分大小写的。 例如:IMAGESOURCE和imageSource 指同一个参数 参数的值都以字符串形式表达。 不管用户是否在参数的值上加引号,参数值都将作为一个字符串传递到Applet中,由Applet以不同的方式对它进行解释,2019/4/14,21,Applet中获取参数的方法,Applet通过getParameter()来获取HTML中定义的参数。 getParameter()方法定义为 public String getParameter(String name) getParameter()方法中的参数应该和HTML中定义的标签中的name属性的值相同 getParameter()方法的返回值和HTML中定义的标签中的Value属性的值相同 如果getParameter()方法使用了HTML中没有定义的参数,则返回值为空字符串(即:“”),2019/4/14,22,编写带参数的Applet,一个Applet的定义为: 在Applet类中获取参数: int windowWidth= 150; if(getParameter(“windowWidth”) !=null) try windowWidth =Integer.parseInt(paramString); catch(NumberFormatException e ) windowWidth=150; ,2019/4/14,23,在Applet类中使用参数,使用getParameter()方法获取的参数都是String类型的值,java.lang中定义了一套将String类型数据转换为基本数据类型数据的方法: Integer.parseInt(String s) Float.parseFloat(String s) Double.parseDouble(String s) 通过这些方法可以方便地将String类型转换成为基本数据类型,2019/4/14,24,appletViewer,为了简化并提高Applet的开发速度,JDK提供了一个浏览Applet的简易工具:appletviewer appletviewer位于JDK目录下的bin目录中,2019/4/14,25,appletviewer的使用,appletviewer的格式如下 appletviewer url(s) 包括: -debug:在 Java 调试器中启动 applet 小程序查看器 -encoding :指定由 HTML 文件使 用的字符编码 -J:向 Java 解释器传递参数 url(s)指定定包含Applet标记的Html文件,2019/4/14,26,Applet举例,import java.applet.Applet; import java.awt.Graphics; public class SimpleApp extends Applet StringBuffer buffer; public void init() buffer = new StringBuffer(); addItem(“Applet初始化. “); public void start() addItem(“Applet启动. “); public void stop() addItem(“Applet停止运行. “); ,2019/4/14,27,public void destroy() addItem(“准备卸载.n“); void addItem(String newWord) System.out.println(newWord); buffer.append(newWord); repaint(); public void paint(Graphics g) g.drawRect(0, 0, getSize().width - 1, getSize().height - 1); g.drawString(buffer.toString(), 5, 15); ,2019/4/14,28,SimpleApp.html文件: ,2019/4/14,29,示例说明,例题展示了Applet生命周期的全过程 例题展示了最简单的Applet标签的表示 例题展示了appletviewer的使用,2019/4/14,30,示例执行(1),在dos窗口中输入如下命令 appletviewer SimpleApp.html 此时弹出如下对话框:,2019/4/14,31,示例执行(1)说明,上述窗口说明了Applet从被初始化到完成在浏览器的显示进行了如下方法的调用 系统首先调用了Applet类中的init()方法 系统随后调用了Applet类中的start()方法 系统最后调用了Applet类中的paint()方法,2019/4/14,32,示例执行(2),点击浏览器窗口的最小化按钮,然后恢复浏览器窗口,返回Applet所在 Web页,此时浏览器显示 如下图:,2019/4/14,33,示例执行(2)说明,当前的动作完成了把Applet实例从运行状态进入到停止状态,又从停止状态进入到运行状态。 当前的动作说明: 当用户离开Applet所在的页面或浏览器变为图标时,浏览器会自动调用stop()方法 说明当浏览器重新变换为窗口状态时,浏览器会自动调用start()方法。,2019/4/14,34,示例执行(3),点击浏览器窗口中的“关闭”按钮,此时Applet被关闭。 此时无法在浏览器中观察到Applet的状态,但是在DOS窗口中添加了两个语句: “Applet停止运行.准备卸载.” 此语句表明当applet关闭之前,如果Applet处于运行状态时,将先调用stop()方法,使之进入关闭状态,再调用destory()方法,使之释放所有内存。如果Applet处于关闭状态时,系统将直接调用destory()方法。,2019/4/14,35,Applet与GUI,Applet类为JPanel的子类,而JPanel为Java图形用户界面中的一个组件。因此Applet可以使用图形化用户界面与用户进行数据交换。 良好的用户界面是Applet的一个重要的优势。,2019/4/14,36,Java GUI简介,AWT是Java基础类库的一个部分,AWT为大规模的GUI开发提供了较丰富的基础结构。 Swing是在AWT的基础上产生,弥补了AWT中的缺陷,同时提供了更强的用户界面组件。,2019/4/14,37,Java中的AWT,AWT的初衷是支持Applet的用户界面 AWT支持图形用户界面,主要功能包括 用户界面组件 事件处理模型 图形和图像工具 布局管理器,2019/4/14,38,AWT中的组件,所有AWT的组件都是抽象类Component或MenuComponent的子类。 Component类封装了组件的通用方法和属性,如组件的大小、位置、前景色、背景色、边界、边框、可见性等等,而MenuComponent主要为菜单设计。 AWT中的组件中有一些组件可以包含其它组件,并使他们成为一个整体,称为容器,它们为类Container的子类 每一个容器类组件都有一个布局管理器,布局管理器使得Java的用户管理界面具有良好的平台无关性。,2019/4/14,39,AWT中的类层次结构,java.lang.object,Component,MenuComponent,LayoutManager,Container,2019/4/14,40,组件类的层次结构,2019/4/14,41,AWT中常用的布局管理器,FlowLayout BorderLayout GridLayout CardLayout GridBagLayout,2019/4/14,42,FlowLayout,FlowLayout把包含的组件从左到右,从上到下,一个挨一个地放置到容器中,它是Panel和Applet的默认布局管理器 组件排列时,它们之间的默认间距为5px,它们默认的对齐方式为中央对齐。 FlowLayout的构造方法 FlowLayout() FlowLayout(int align) FlowLayout(int align,int hgap,int vgap),2019/4/14,43,在Applet使用FlowLayout举例,import java.awt.*; import java.applet.*; public class FlowLayoutTest extends Applet Button b1,b2,b3; TextField tf; Label lab; public void init() b1 = new Button(“ok”); b2 = new Button(“open”); b3 = new Button(“close”); tf = new TextField(“test”); lab = new Label(“Test FlowLayout”);,2019/4/14,44,setLayout(new FlowLayout(FlowLayout.LEFT,20,30); add(b1); add(b2); add(b3); add(tf); add(lab); HTML文件内容为 ,2019/4/14,45,举例说明(1),使用appletviewer运行FlowLayoutTest后的初始窗口如下: 可以看出Applet中的组件是从左到右,从上到下依次排列,2019/4/14,46,举例说明(2),当窗口大小被调整后,FlowLayout会自动重新调整组件的位置,如下图所示:,2019/4/14,47,BorderLayout,BorderLayout按照东南西北中的方位排列组件,所以使用BorderLayout的组件中只能包含5个组件 如果使用BorderLayout的组件在相同的方位上多次添加组件,则最后被添加的组件会被显示出来 当BorderLayout的四周组件缺少时,中心组件将填充剩余部分。 BorderLayout是Window、Frame、Dialog的默认布局管理器。,2019/4/14,48,在Applet中使用BorderLayout举例,import java.awt.*; import java.applet.*; public class BorderLayoutTest extends Applet Button buttonNorth,buttonSouth, buttonWest,buttonEast,buttonCenter; public void init() buttonNorth = new Button(“North“); buttonSouth = new Button(“South“); buttonWest = new Button(“West“); buttonEast = new Button(“East“); buttonCenter = new Button(“Center“);,2019/4/14,49,setLayout(new BorderLayout(); add(buttonNorth,BorderLayout.NORTH); add(buttonSouth,BorderLayout.SOUTH); add(buttonWest,BorderLayout.WEST); add(buttonEast,BorderLayout.EAST); add(buttonCenter,BorderLayout.CENTER); HTML文件内容为 ,2019/4/14,50,举例说明,使用appletviewer执行BorderLayoutTest后,结果输出如下图,2019/4/14,51,举例说明(2),当窗口大小被调整后,容器中的组件会根据最佳尺寸作调整,如:窗口被水平拉长后,南北组件会水平伸展,东西组件保持不变,中心组件将水平扩展,如下图所示,2019/4/14,52,GridLayout,GridLayout是一个网格布局管理器,它使容器中的各个组件呈网格状布局 GridLayout中的每个网格可容纳一个组件,同时网格中的组件会填满整个网格单元 GridLayout的构造方法 GridLayout() GridLayout(int rows,int cols)/指定网格的行数、列数 GridLayout(int rows,int cols,int hgap,int vgap) /指定网格的行数、列数、行间距、列间距,2019/4/14,53,在Applet中使用GridLayout举例,import java.awt.*; import java.applet.*; public class GridLayoutTest extends Applet Button bs; public void init() bs = new Button7; setLayout(new GridLayout(3,3,10,10); for(int i=0;ibs.length;i+) bsi = new Button(Integer.toString(i); add(bsi); ,2019/4/14,54,举例说明,使用appletviewer执行GridLayoutTest后,结果如下图所示,2019/4/14,55,CardLayout,CardLayout以“卡片”格式将容器所包含的组件“叠放”在一起,任何时候只有其中一个组件能够被显示出来。 CardLayout使得多个组件共享一个显示空间。 被添加到使用CardLayout的容器中的组件按照被添加的顺序排列,即按照add()方法被调用的顺序进行排列。,2019/4/14,56,CardLayout的常用方法,first(Container parent)/显示第一个被添加的组件 next(Container parent)/显示当前组件之后被添加的 /组件 previous(Container parent)/显示当前组件之前被添 /加的组件 last(Container parent)/显示最后一个被添加的组件 show(Container parent,String name)/显示以给拟定 /名称命名的组件,2019/4/14,57,在Applet中使用CardLayout举例,import java.awt.*; import java.awt.event.*; import java.applet.*; public class CardLayoutTest extends Applet implements ActionListener Panel p1,p2,p3,centerPane; CardLayout card; Button firstButton,lastButton,nextButton, previousButton; List cardList;,2019/4/14,58,public void init() setLayout(new BorderLayout(); Label lab1 = new Label(“first“); p1 = new Panel(); p1.add(lab1); Label lab2 = new Label(“Second“); p2 = new Panel(); p2.add(lab2); Label lab3 = new Label(“Third“); p3 = new Panel(); p3.add(lab3); centerPane = new Panel(); card = new CardLayout(); centerPane.setLayout(card);,2019/4/14,59,centerPane.add(p1,“first“); centerPane.add(p2,“second“); centerPane.add(p3,“third“); add(centerPane, BorderLayout.CENTER); Panel bottomPane = new Panel(); firstButton = new Button(“first“); firstButton.addActionListener(this); firstButton.setActionCommand(“first“); nextButton = new Button(“next“); nextButton.addActionListener(this); nextButton.setActionCommand(“next“);,2019/4/14,60,previousButton = new Button(“previous“); previousButton.addActionListener(this); previousButton. setActionCommand(“previous“); lastButton = new Button(“last“); lastButton.addActionListener(this); lastButton.setActionCommand(“last“); cardList = new List(3,false); cardList.add(“first“); cardList.add(“second“); cardList.add(“third“); cardList.addActionListener(this);,2019/4/14,61,bottomPane.add(firstButton); bottomPane.add(nextButton); bottomPane.add(previousButton); bottomPane.add(lastButton); bottomPane.add(cardList); add(bottomPane,BorderLayout.SOUTH); public void actionPerformed(ActionEvent e) if(e.getSource() instanceof List) String s = cardList.getSelectedItem(); card.show(centerPane,s); else String command = e.getActionCommand();,2019/4/14,62,if(command.equals(“first“) card.first(centerPane); else if(command.equals(“next“) card.next(centerPane); else if(command.equals(“previous“) card.previous(centerPane); else if(command.equals(“last“) card.last(centerPane); ,2019/4/14,63,示例说明(1),使用Applet执行CardLayoutTest,结果如下图所示,centerPane 使用了CardLayout,bottomPane 使用了默认的 FlowLayout,整个Applet使用了 BorderLayout,2019/4/14,64,示例说明(2),当前的举例中使用到了事件处理,bottomPane中的四个bottom和一个list在被选中后执行了不同的事件(下一讲中将详细说明) “first”按钮按下时执行cardLayout.first()方法 “next”按钮按下时执行cardLayout.next()方法 “previous”按钮按下时执行cardLayout.previous()方法 “last”按钮按下时执行cardLayout.last()方法 当选中list中某项时执行cardLayout.show()方法。,2019/4/14,65,事件处理模型中的三种对象,事件源:引发事件的组件。 事件:发生在用户界面上的,用户对某组件产生的操作。 事件监听器:对特定的事件源产生的事件进行处理的对象。,2019/4/14,66,事件处理模型,Java中的GUI事件处理模型称为:事件授权模型,事件源,事件监听器,事件,事件源将用户对其产生的各种事件委托给一个或多个事件监听器,用户操作,产生,将事件传递给监听器, 同时引发监听器对事件的处理,2019/4/14,67,事件类,与AWT有关的所有事件类都是java.awt.AWTEVent的子类,而AWTEVent是java.util.EventObject的子类,如下:,AWTEvent,TextEvent,ItemEvent,ComponentEvent,AdjustmentEvent,ActionEvent,WindowEvent,PointEvent,InputEvent,FocusEvent,ContainerEvent,keyEvent,MouseEvent,2019/4/14,68,事件监听器,所有的事件监听器都是接口 AWT中的监听器接口如下,2019/4/14,69,事件适配器类,为了简化监听器的实现,Java为一些监听器接口提供了适配器类。 事件适配器类 ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WinodwAdapter,2019/4/14,70,事件、监听器及组件间的关联,任何组件只和特定类型的事件相关联,同时任何监听器只能监听一种类型的事件,2019/4/14,71,ActionEvent,可产生ActionEvent的组件 Button、List、MenuItem、TextField 监听ActionEvent的监听器 ActionListener 监听器方法 actionPerformed(ActionEvent e),2019/4/14,72,AdjustmentEvent,可产生AdjustmentEvent的组件 Srollbar 监听AdjustmentEvent的监听器 AdjustmentListener 监听器方法 adjustmentValueChanged(AdjustmentEvent e),2019/4/14,73,ComponentEvent,可产生ComponentEvent的组件 Button、Canvas、Checkbox、Choice、Dialog、Frame、Label、List、Panel、ScrollBar、ScrollPane、TextArea、TextField、Window 监听ComponentEvent的监听器 ComponentListener 监听器方法 componentHidden(ComponentEvent e) componentMoved(ComponentEvent e) componentResized(ComponentEvent e) componentShown(ComponentEvent e),2019/4/14,74,ContainerEvent,可产生ContainerEvent的组件 Dialog、Frame、Panel、ScrollPane、Window 监听ContainerEvent的监听器 ContainerListener 监听器方法 componentAdded(ContainerEvent e) componentRemoved(ContainerEvent e),2019/4/14,75,FocusEvent,可产生FocusEvent的组件 Button、Canvas、Checkbox、Choice、Dialog、Frame、Label、List、Panel、ScrollBar、ScrollPane、TextArea、TextField、Window 监听FocusEvent的监听器 FocusListener 监听器方法 focusGained(FocusEvent e) focusLost(FocusEvent e),2019/4/14,76,ItemEvent,可产生ItemEvent的组件 Checkbox、Choice、List、CheckboxMenuItem 监听ItemEvent的监听器 ItemListener 监听器方法 itemStateChanged(ItemEvent e),2019/4/14,77,KeyEvent,可产生KeyEvent的组件 Button、Canvas、Checkbox、Choice、Dialog、Frame、Label、List、Panel、ScrollBar、ScrollPane、TextArea、TextField、Window 监听KeyEvent的监听器 KeyListener 监听器方法 keyPressed(KeyEvent e) keyReleased(KeyEvent e) keyTyped(KeyEvent e),2019/4/14,78,MouseEvent,可产生MouseEvent的组件 Button、Canvas、Checkbox、Choice、Dialog、Frame、Label、List、Panel、ScrollBar、ScrollPane、TextArea、TextField、Window 监听MouseEvent的监听器 MouseListener、MouseMotionListener,2019/4/14,79,MouseEvent的监听器方法,MouseListener方法 mouseClicked(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) MouseMotionListener方法 mouseDragged(MouseEvent e) mouseMoved(MouseEvent e),2019/4/14,80,TextEvent,可产生TextEvent的组件 TextArea、TextField 监听TextEvent的监听器 TextEvent 监听器方法 textValueChanged(TextEvent e),2019/4/14,81,WindowEvent,可产生WindowEvent的组件 Dialog、Frame、Window 监听WindowEvent的监听器 WindowEvent 监听器方法 windowActivated(WindowEvent e) windowClosed(WindowEvent e) windowClosing(WindowEvent e) windowDeactivated(WindowEvent e) windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) windowOpened(WindowEvent e),2019/4/14,82,Applet的显示,由于Applet是AWT的一个组件,所以它具有AWT组件的图形绘制功能 图形绘制的有关方法 paint(Graphics g):用于执行具体的绘制操作,如果Applet需要完成在其中进行绘图的功能,必须重载paint()方法 update(Graphics):用于更新图形,一般情况下不需要重载 repaint():用于重新绘制图形,在组件的外形发生变化时,repaint()方法会自动被系统调用,2019/4/14,83,java.awt.Graphics,Graphics是绘图的关键 Graphics可以支持两种绘图 基本绘图:包括线、矩形、圆、文字等等的绘制 图像绘制:动画制作,2019/4/14,84,Graphics中的绘图方法,drawLine drawRect drawRoundRect draw3DRect drawPolygon drawOval drawArc drawString 另外对于封闭图形Graphics还提供相对应的填充(fill) 方法,2019/4/14,85,绘制基本图形举例,public void paint(Graphics g) g.setColor(Color.red); g.drawLine(0,0,20,20); g.setColor(Color.blue); g.setFont(new Font(“SanSerif”,Font.PLAIN,14); g.drawString(“test”,20,20); ,2019/4/14,86,精确绘制文字,字体对象Font Font类对所有的字体处理进行了抽象,为文字的绘制提供了灵活性 通过Graphics的setFont()和getFont()可以设置和获取当前的字体对象。 Font的构造方法 Font(String fontName,int style,int size),2019/4/14,87,获取操作系统中的字体列表,通过下列方式可以获取系统的图形环境中支持的字体列表。 GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String fontList = ge.getAvailableFontFamilyNames();,2019/4/14,88,获取字体列表举例,import java.awt.*; import java.applet.Applet; public class AllFonts extends Applet String fontList; public void init() GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); fontList = ge.getAvailableFontFamilyNames(); ,2019/4/14,89,public void paint(Graphics g) Dimension d = getSize(); int x = 10,y = 10,index=0,xWidth = d.width/4; int fontSize = g.getFont().getSize(); while(indexfontList.length) String fontName = fontListindex; Font f = new Font(fontName,Font.PLAIN,fontSize); g.setFont(f); g.drawString(fontName, x+(index%4)*xWidth,y); index+; if(index%4)=0)y+=fontSize+5; ,2019/4/14,90,事例说明,用appletviewer运行上述程序,结果如下图所示,2019/4/14,91,字模FontMetrics,FontMetrics类提供了一系列获取某种字体的某个字符在屏幕上的特定尺寸的方法。 字模使用以下位置信息来确定文字的绘制位置 基线(BaseLine) 底线(DescenderLine) 顶线(AscenderLine) 行间距(Leading) 前进宽度(Advance Width),2019/4/14,92,字模中的各种位置之间的距离,Advance width leading height,2019/4/14,93,字模中的位置信息,Gg,Jj,AscenderLine,BaseLine,DescenderLine,AscenderLine,BaseLine,DescenderLine,Advance Width,Advance Width,Leading,descent,ascent,Height,(x,y),2019/4/14,94,精确绘制字符举例,public void paint(Graphics g) Font f = new Font(“Arial“,Font.PLAIN,20); g.setFont(f); int x = 6,y = 30; String s1 = “abcdefghijklmnopqrstuvwxyz“; String s2 = “ABCDEFGHIJKLMNOPQRSTUVWXYZ“; FontMetrics fs = g.getFontMetrics(); g.setColor(Color.blue); g.drawString(s1,x,y); Rectangle2D r = fs.getStringBounds(s1,g);,2019/4/14,95,g.drawLine(x,y,x+(int)r.getWidth(),y); g.drawLine(x,y+fs.getDescent(),x+(int)r.getWidth(), y+ fs.getDescent(); g.setColor(Color.green); y+=fs.getLeading()+fs.getDescent(); r = fs.getStringBounds(s2,g); fs = g.getFontMetrics(); y+=fs.getAscent(); g.drawString(s2,x,y); g.drawLine(x,y-fs.getAscent(),x+(int)r.getWidth(), y-fs.getAscent(); g.drawLine(x,y,x+(int)r.getWidth(),y); g.drawLine(x,y+fs.getDescent(),x+(int)r.getWidth(), y+fs.getDescent(); ,2019/4/14,96,举例说明,上例仅仅列举了Applet的paint()方法。 使用appletviewer执行上述程序,结果如下图所示,2019/4/14,97,Applet对多媒体的支持,Applet对图像的支持 Applet对动画的支持 Applet对声音的支持,2019/4/14,98,Applet中的图象处理,图像信息封装在java.awt.Image类中 目前Java可以处理的图像格式为:jpg、gif、png Applet的图像处理包括: 加载图像 显示图像 生成图像 处理图像,2019/4/14,99,加载图片的方式(1),使用Applet中提供的getImage()方法进行图像加载 Image getImage(URL url) Image getImage(URL url,String name) 使用Toolkit进行图像加载 任何Java的GUI组件都可以通过getToolkit()方法获取当前的Toolkit实例 Image img = getToolkit().getImage(String fileName) Image img = getToolkit().getImage(URL url),2019/4/14,100,加载图片方式(2),使用类MediaTracker 如果只想知道图像何时能够加载完毕,可以使用类MediaTracker 使用MediaTracker的方法 MediaTracker tracker=new MediaTracker(Component comp); tracker.addImage(Image img,int id); try tracker.waitForID(id) catch(Exception e),img为要跟踪的图像,id为图像的标识,id较小的图像优先加载,waitForID()方法用于等待对应id的图片加载完毕,2019/4/14,101,图像的加载方式(3),接口ImageObserver 接口ImageObserver可以进行图像文件的加载过程的跟踪。 所有的Component类都是ImageObserver的子类 ImageObserver接口的方法 boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height),2019/4/14,102,图像的显示,图像的显示通过Graphics类中的drawImage()方法来完成 Graphics中常用的drawImage()方法 boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor,ImageObserv

温馨提示

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

评论

0/150

提交评论