680 likes | 859 Views
第 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 { ;}
E N D
第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 { ;} • applet都继承自java.applet.Applet类,由Sun公司事先定义好了. • 每个小应用都有一个主程序类, 之前必须加上public.
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 所有小应用程序的根源
本地程序 2.1 所有小应用程序的根源 • Applet的限制 SERVER Browser Applet被下载的 connection applet file SERVER connection local 与applet无关的 本地方法
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)
2.1 所有小应用程序的根源 • 一个applet的可视周期 init start 重新装入或改变页面大小或返回Web页面 离开web页面 stop destroy
2.1 所有小应用程序的根源 • 有关paint()方法 • Applet本身是一个容器,因此任何输出都必须用图形方法paint() • 当小应用首次被装载,以及每次窗口放大、缩小、刷新时都要调用paint方法 • paint()是由浏览器调用的, 而不是由程序调用,当程序希望调用paint方法时,用repaint命令 • paint方法的参数是Graphics类的对象 g,它在java.awt.Graphics内 • paint(Graphicd g){。。。}
2.1 所有小应用程序的根源 AWT thread(waiting) repaint() Exposure update() { clear arae call paint() paint()
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
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); }
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>
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>
2.2 小试身手 • ALIGN,HSPACE,VSPACE 其它文字 Java applet hspace vspace 其它文字 <APPLET CODE=“showdate.class” width=600 height=80> vspace=100 hspace=100 </APPLET>
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);
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=“”; }
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>
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); }
0 x y 2.3 图形处理 2.3.1图形坐标系统 任何与绘图有关的操作 第一个要用的是 java.awt.Graphics类 Graphics类的对象不是 由new产生的,而是由系 统或其他方式直接将生好的Graphics对象当作方法的参数,再交给程序设计者去处理.例如: paint(Graphics g)
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() }
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);
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()
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
2.3 图形处理 • 获取更详细的数据 请查阅有关FontMetrics类的方法 fontMetrics=getFontMetrics(font); • FontMetrics中比较重要的方法有: stringWidth, charWidth, getAscent, getDescent, getLeading, getHeigh
2.3 图形处理 2.3.2.2 颜色的调整 • Color对象的使用 创造自己的颜色: Color mycolor=new Color(int red, int blue, int green); • g.setColor(Color.yellow) • g.setColor(mycolor); • 例:随机产生颜色,并画圆
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); }}}
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
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”);
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);
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()
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); //处理例外 } }}
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”);
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); 规定尺寸 规定背景
不要忘记AWT包 定义Image对象了吗? 指定图像的URL了吗? 把图像取出来吧. 还记得画图像用什么方法和命令吗? 2.5 载入现有图像文件 • 完整的过程 在类中 在init0中 在paint0中
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);}}
开始 显示进度 数学运算 引出最后结果 线程1 线程2 2.6 动态效果---线程的应用 2.4 动态效果---线程的应用 • 什么是线程? 线程是执行中的程序中的单个顺序控制流. • Java支持多线程
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); } }
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; } }
2.6 动态效果---线程的应用 • 实现一个线程 让Applet类去实现Runable接口,创建一个线程类 改写方法start,在其中产生一个新的线程来工作 改写stop方法,在其中编写结束线程的程序代码 引入新的方法,将分给线程的工作写到run中
2.6 动态效果---线程的应用 第一步:实现Runable接口 public class xc extends java.applet.Applet implements Runnable { Thread smallthread=null; … } Thread是一个类,只有是它的实例才能具有线程的功能 主函数中要定义一个线程变量
2.6 动态效果---线程的应用 第二步:改写方法start public void start() { if(smallthread == null) { smallthread= new Thread(this); smallthread.start(); //从现在开始程序由两个线程在执行 }} 第三步:改写stop方法 public void stop() { smallthread.stop(); //停止线程 smallthread = null; //释放线程对象}
2.6 动态效果---线程的应用 第四步:新的方法run 将让线程要做的事放run中 public void run() { while (true) { repaint(); try {Thread.sleep(1000);} catch(InterruptedException e){} } }
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){} }}
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; }
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);
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
主类 取时间 paint() {} clock类 Show(){} clock(){} drawNiddle(){} 初始化 换算弧度 画图 2.6 动态效果---线程的应用
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);
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); }
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))); } }