1 / 68

第 2 章 Java 小应用

第 2 章 Java 小应用. 北京大学计算机系 代亚非. 第 2 章 Java 小应用. 2.1 所有小应用程序的根源 2.2 小试身手 2.3 图形操作 2.4 URL 类 2.5 载入现有图像文件 2.6 动画效果 2.7 播放声音 2.8 小 结. 2.1 所有小应用程序的根源. 2.1.1 小应用的特点 回忆一下小应用程序的书写格式 import java.applet.*; public class MyApplet extends Applet { ;}

carver
Download Presentation

第 2 章 Java 小应用

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第2章 Java小应用 北京大学计算机系 代亚非

  2. 第2章 Java小应用 • 2.1 所有小应用程序的根源 • 2.2 小试身手 • 2.3 图形操作 • 2.4 URL类 • 2.5 载入现有图像文件 • 2.6 动画效果 • 2.7 播放声音 • 2.8 小 结

  3. 2.1 所有小应用程序的根源 • 2.1.1 小应用的特点 • 回忆一下小应用程序的书写格式 import java.applet.*; public class MyApplet extends Applet { ;} • applet都继承自java.applet.Applet类,由Sun公司事先定义好了. • 每个小应用都有一个主程序类, 之前必须加上public.

  4. http://someLocation/file.html 1. Browser loads URL <Html> <Applet code= ….> </Applet> 2. Browser loads HTML document 3. Browser loads applet classes Applet class http://someLocation/file.html Location: 4. Browser run applet Loading... 2.1 所有小应用程序的根源

  5. 本地程序 2.1 所有小应用程序的根源 • Applet的限制 SERVER Browser Applet被下载的 connection applet file SERVER connection local 与applet无关的 本地方法

  6. 2.1 所有小应用程序的根源 • 2.1.2 applet的生命周期 • paint()虽不在生命周期内,但它的作用相当于applet的灵魂 Java.applet.Applet public void init() public void destroy() public void start() public void stop() public void paint(Graphics g)

  7. 2.1 所有小应用程序的根源 • 一个applet的可视周期 init start 重新装入或改变页面大小或返回Web页面 离开web页面 stop destroy

  8. 2.1 所有小应用程序的根源 • 有关paint()方法 • Applet本身是一个容器,因此任何输出都必须用图形方法paint() • 当小应用首次被装载,以及每次窗口放大、缩小、刷新时都要调用paint方法 • paint()是由浏览器调用的, 而不是由程序调用,当程序希望调用paint方法时,用repaint命令 • paint方法的参数是Graphics类的对象 g,它在java.awt.Graphics内 • paint(Graphicd g){。。。}

  9. 2.1 所有小应用程序的根源 AWT thread(waiting) repaint() Exposure update() { clear arae call paint() paint()

  10. 2.2 小试身手 • 2.2.1 起始页上的时间和日期 • 介绍两个类: 1. 类名:Date 创建一个实例 Date timeNow=new Date(); 2. 类名Font 创建一个实例 Font msgFont=new Font(“TimesRoman”,Font.ITALIC,30); 0Mon Dec 07 14:23:50 GMT+08:00 1998

  11. 2.2 小试身手 看下面的例子,想一想生命周期的四个方法哪去了? import java.awt.*; import java.util.Date; public class showDate extends java.applet.Applet { Date timeNow=new Date(); Font msgFont=new Font(“TimesRoman”,Font.ITALIC,30); public void paint(Graphics g) { g.setFont(msgFont); g.setColor(Color.blue); g.darwString(timeNow.toString(),5,50); }

  12. 2.2 小试身手 2.2.2 在起始页中加入applet • html中有关的代码 <APPLET CODE=“showdate.class” width=600 height=80> </APPLET> • CODEBASE的作用 当class文件与起始页文件不在同一个目录下时,使用CODEBASE说明 <APPLET CODE=“showdate.class” width=600 height=80> CODEBASE=“\myjava\class”</APPLET>

  13. C:\ C:\ myjava myjava public javacode class public javacode class Index.html showdate showdate Index.html 2.2 小试身手 <APPLET CODE=“showdate.class” width=600 height=80> CODEBASE=“\myjava\class” </APPLET> <APPLET CODE=“showdate.class” width=600 height=80> </APPLET>

  14. 2.2 小试身手 • ALIGN,HSPACE,VSPACE 其它文字 Java applet hspace vspace 其它文字 <APPLET CODE=“showdate.class” width=600 height=80> vspace=100 hspace=100 </APPLET>

  15. 2.2 小试身手 • 向applet传递参数的两个步骤 1. 在起始页中要有<PARAM>标签 2. 在applet中要有getParameter方法 在起始页中有: <applet code=showdate width=600 heigt=80> <param name=rem value=“时间是: ”></applet> 在applet中有: string title=getParameter(rem); 在显示时间的命令中加入title: g.drawString(title+timeNow.toString(),5,50);

  16. 2.2 小试身手 import java.awt.*; import java.util.Date; public class showDate extends java.applet.Applet { Date timeNow=new Date(); String title; Font msgFont=new Font(“TimesRoman”,Font.ITALIC,30); public void paint(Graphics g) { g.setFont(msgFont); g.setColor(Color.blue); g.darwString(title+ timeNow.toString(),5,50); } public void init() {title=getParameter (“rem”); if (title==null) title=“”; }

  17. 2.2 小试身手 • 例:利用一个可以显示运行字符串的类,显示自己的字符串 (htmlpara.html) <applet code=htmlpara.class width=300 heigh=200> <param name=MESSAGE value=”this is a test"> <param name=FONT value="BOLD"> <param name=POINT_SIZE value=20></applet>

  18. 2.2 小试身手 public void init() { String paramete; parameter=getParameter("MESSAGE"); if (parameter!=null) message=parameter; parameter=getParameter("FONT"); if (parameter!=null) font_to_use=parameter; parameter=getParameter("POINT_SIZE"); if (parameter!=null) point_size=Integer.parseInt(parameter); }

  19. 0 x y 2.3 图形处理 2.3.1图形坐标系统 任何与绘图有关的操作 第一个要用的是 java.awt.Graphics类 Graphics类的对象不是 由new产生的,而是由系 统或其他方式直接将生好的Graphics对象当作方法的参数,再交给程序设计者去处理.例如: paint(Graphics g)

  20. 2.3 图形处理 • Graphics的方法 paint(Graphics g) { g.clearRect(); g.copyArea(); g.drawAre() ; g.drawLine(); g.drawOval();g.drawRect(); g.drawPolygon(); g.fillArc(); g.fillOval(); g.fillPolygen(); g.fillRect(); g.getColor(); g.getFont() g.setFont(); g.setColor(); g.getFontMetrics() g.fillRoundRect() }

  21. 2.3 图形处理 2.3.2 字型和颜色的设置 2.3.2.1 字型设置的方法 Font font=new Font(“TimesRoman”,Font.ITALIC,24); g.setFont(font); • 在小应用程序中显示输出的方法 g.drawString(String, int x, int y); g.drawChars(char data[], int offset, int length, int x, int y);

  22. 2.3 图形处理 g.drawBytes(byte data[],int offset, int length, int x, int y); 例:g.drawString(“This is a test”,5,10); • 获取字体的属性 Font font=g.getFont(); • Font类中常用的方法 GetFamily() getName() getSize() getStyle() isItalic() isPlain() isBold() toString()

  23. 2.3 图形处理 import java.awt.Graphics; import java.awt.Font; public class drawtext extends java.applet.Applet { Font fn=new Font("TimesRoman",Font.ITALIC,20); public void paint(Graphics g) { g.setFont(fn); g.drawString(”Font demo”,5,10); } } Font demo

  24. 2.3 图形处理 • 获取更详细的数据 请查阅有关FontMetrics类的方法 fontMetrics=getFontMetrics(font); • FontMetrics中比较重要的方法有: stringWidth, charWidth, getAscent, getDescent, getLeading, getHeigh

  25. 2.3 图形处理 2.3.2.2 颜色的调整 • Color对象的使用 创造自己的颜色: Color mycolor=new Color(int red, int blue, int green); • g.setColor(Color.yellow) • g.setColor(mycolor); • 例:随机产生颜色,并画圆

  26. 2.3 图形处理 import java.awt.Graphics; import java.awt.Color; public class drawcircle extends java.applet.Applet { public void paint(Graphics g) { int red,green,blue,x; for (x=0;x<370;x+=30){ red=(int)Math.floor(Math.random()*256); green=(int)Math.floor(Math.random()*256); blue=(int)Math.floor(Math.random()*256); g.setColor(new Color(red,green,blue)); g.fillOval(x,0,30,30); }}}

  27. 2.4 URL类 2.4.2 构造URL类 (全名java.lang.URL) • 绝对URL的构造方法: URL(String spec) 例: URL url=new URL (http://www.hit.edu.cn/cv/index.html”) • 相对URL的构造方法: 某绝对地址:http://rainy.hit.edu.cn/test.html 在该目录下有两个文件 mywork.html myfamily.html

  28. 2.4 URL类 URL base=new URL(“http://rainy.hit.edu.cn”); URL url1=new (base, “mywork.html”); URL url2=new (base, “mywork.html”); • 其他URL的构造方法: URL url=new URL (“http”, “www.hit.edu.cn”,“/~dyf/test.html”);

  29. web page html applet 浏览器 服务器 2.4 URL类 2.4.3 获取小应用程序HTML页面的URL和小应用程序本身的URL • URL html=getDocumentBase(); • System.out.print(html); • URL codebase=getCodeBase(); • System.out.print(codebase);

  30. 2.4 URL类 • 2.4.4 URL异常(MalformedURLException) 当创建URL时发生错误,系统会产生异常 try{ URL url=new URL(str); }catch(MalformedURLException( e) { DisplayErrorMessage();} • 2.4.5 URL类的基本方法 String getProtocol(), String getHost(), ing getPort(), String getFile(), String getRef()

  31. 2.4 URL类 • 构造URL的实例 import java.net.URL; import java.net.MalformedURLException; public class Test { URL url1,url2,url3; void test() { try { url1= new URL(“file:/D:/image/example.gif”); url2= new URL(“http://www.hit.edu.cn/cv/”); url1= new URL(url2, “hit.gif”); }catch (MalformedURLException e); //处理例外 } }}

  32. 2.5 载入现有图像文件 Image类 • java支持gif和jpg两种格式的图像 • 图像文件的URL: URL picurl= new URL (“http://xxx.yyy.edu/Applet/img1.gif”); • 取一幅图像构成图像对象 Image img1 = getImage(picurl); Image img2 = getImage(getCodeBase(), “img2.gif”);

  33. 2.5 载入现有图像文件 • 显示一幅图像: g.drawImage(img1, x, y, this); g.drawImage(img1, x, y,Color.red, this); g.drawImage(image1, x, y,x2,y2,Color.red, this); 规定尺寸 规定背景

  34. 不要忘记AWT包 定义Image对象了吗? 指定图像的URL了吗? 把图像取出来吧. 还记得画图像用什么方法和命令吗? 2.5 载入现有图像文件 • 完整的过程 在类中 在init0中 在paint0中

  35. 2.5 载入现有图像文件 import java.applet.*;import java.awt.*; public class image extends Applet { Image img; public void init() { img=getImage(getCodeBase(),"img0001.gif");} public void paint(Graphics g) { int width=img.getWidth(this); int height=img.getHeight(this); g.drawRect(52,52,width+30,height+30); g.drawImage(img,57,57,width+20,height+20,this);}}

  36. 开始 显示进度 数学运算 引出最后结果 线程1 线程2 2.6 动态效果---线程的应用 2.4 动态效果---线程的应用 • 什么是线程? 线程是执行中的程序中的单个顺序控制流. • Java支持多线程

  37. 2.6 动态效果---线程的应用 • 静态的情况 import java.applet.*; import java.awt.Graphics; public class maguee extends Applet { public void paint(Graphics g) { g.drawString("Hello, Java!",0,0); } }

  38. 2.6 动态效果---线程的应用 • 动态的情况(不是多线程) public void init() { x=size().width; y=size().height/2; width=x; } public void paint(Graphics g) { while(true) { g.drawString("Hello, Java!",x,y); x-=10; if(x<0) x=width; } }

  39. 2.6 动态效果---线程的应用 • 实现一个线程 让Applet类去实现Runable接口,创建一个线程类 改写方法start,在其中产生一个新的线程来工作 改写stop方法,在其中编写结束线程的程序代码 引入新的方法,将分给线程的工作写到run中

  40. 2.6 动态效果---线程的应用 第一步:实现Runable接口 public class xc extends java.applet.Applet implements Runnable { Thread smallthread=null; … } Thread是一个类,只有是它的实例才能具有线程的功能 主函数中要定义一个线程变量

  41. 2.6 动态效果---线程的应用 第二步:改写方法start public void start() { if(smallthread == null) { smallthread= new Thread(this); smallthread.start(); //从现在开始程序由两个线程在执行 }} 第三步:改写stop方法 public void stop() { smallthread.stop(); //停止线程 smallthread = null; //释放线程对象}

  42. 2.6 动态效果---线程的应用 第四步:新的方法run 将让线程要做的事放run中 public void run() { while (true) { repaint(); try {Thread.sleep(1000);} catch(InterruptedException e){} } }

  43. import java.applet.*; import java.awt.Graphics; public class MovingCharacter extends Applet implements Runnable { int x=200; Thread my_thread=null; //------------------------------------------------- public void start() { my_thread=new Thread(this); my_thread.start(); } 2.6 动态效果---线程的应用 public void run() { while(true) { repaint(); try { Thread.sleep(100); } catch(InterruptedException e){} }}

  44. 2.6 动态效果---线程的应用 • . public void stop() { my_thread.stop(); } public void paint(Graphics g) { g.drawString("Hello, Java!",x,y); x-=10; if(x<0) x=200; }

  45. 2.6 动态效果---线程的应用 • 跳动的小球 up=false; x=x-10; if(x<0) x=width; if (up) y=y+10;else y=y-10; if (y<0) up=true; if (y>height) up=false; g.setColor(Color.red); g.fillOval(x,y,30,30);

  46. 2.6 动态效果---线程的应用 例:起始页上的小时钟 一个必须用到的类----Date类,给出系统时间 Date NowTime=new Date(); NowTime.getHours(), NowTime.getMinutes() 自己需要写什么样的类? Clock---把数字时间成图形表示 (Hour*60*60+minute*60+second)/43200*2.0*PI (minute*60+second)/3600*2.0*PI second/60*2.0*PI

  47. 主类 取时间 paint() {} clock类 Show(){} clock(){} drawNiddle(){} 初始化 换算弧度 画图 2.6 动态效果---线程的应用

  48. 2.6 动态效果---线程的应用 class Clock {int hours,minutes,second,radius; Clock(int hrs,int min,int sec) { hours=hrs%12; minutes=min; second=sec; } void show(Graphics g, int x, int y,int redius) { int hrs_len=(int)(radius*0.5); int min_len=(int)(radius*0.7); int sec_len=(int)(radius*0.85); double theta; g.drawOval(x ,y, radius*2, radius*2);

  49. 2.6 动态效果---线程的应用 theta=(double)(hours*60*60+minutes*60+second)/ 43200.0*2.0*Math.PI; drawNiddle(g,Color.blue, x, y, hrs_len, theta); theta=(double)(minutes*60-second)/3600.0*2.0*Math.PI; drawNiddle(g,Color.blue, x, y, min_len,theta); theta=(double)second/60.0*2.0*Math.PI; drawNiddle(g,Color.red, x, y, sec_len, theta); }

  50. 2.6 动态效果---线程的应用 private void drawNiddle(Graphics g, Color c, int x, int y, int len, double theta) { g.setColor(c); g.drawLine(x,y,(int)(x+len*Math.sin(theta)), (int)(y-len*Math.cos(theta))); } }

More Related