第16章 小程序设计
Java语言程序有两种基本形式:应用程序Application和小程序Applet。前面的例子都是应用程序。
16.1 小程序的基本工作原理
作为解释型语言,Java语言的字节码需要一个专门的解释器来执行它。对于Java应用程序来说,这个解释器就是独立的软件,如JDK的java.exe。但是对于Java小程序来说,这个解释器就是Internet的浏览器软件,或更加确切地说,就是兼容Java语言的浏览器。
小程序的基本工作原理,讲编译好的小程序字节码文件,即.class文件保存在特定的www服务器上,在同一个或另一个www服务器上保存着嵌入有该字节码文件名的指定HTML文件。当某一个浏览器向服务器请求下载嵌入了小程序的HTML文件时,该文件从www服务器上下载到客户端,由www浏览器解释HTML文件中的各种标记,讲文件中的信息以一定的格式显示在用户的屏幕上。当浏览器遇到字节码文件从www服务器上下载到本地,并利用浏览器本身拥有的java解释器直接执行该字节码文件。
从某种意义上来说,小孩层序有些类似于组件。与独立的应用程序不同,小程序所实现的功能是不完全的,需要与浏览器中已经预先实现好的功能结合在一起才能构成一个完整的程序。
16.2 JApplet类
JApplet类是一个特殊的图形类,包含在javax.swing类库中。
JApplet类只有一种形式的构造方法:public Applet()。利用这个构造方法即可以创建一个小程序实例,通常此构造方法为浏览器所调用。
1. init()方法
该方法是小程序被创建时第一个调用的方法,它只运行一次,主要是用来对小程序设置初值使用。它的原理和一个构造方法差不多。一般进行的操作是:设置初始状态参数和参数值,添加用户组件以及装载图像等。
2. start()方法
调用完Init()方法后,就立即调用start()方法。之哟啊小程序画面每出现一次,start()方法就会被调用一次。如切换到其他网页浏览,再返回到本页面时,用户使用了浏览器的Reload操作等,start()方法就会再运行一次。
3. stop()方法
stop方法类似于start方法的逆操作,当浏览器窗口失去焦点变成不活动状态、切换到其他网页浏览器或者是关闭浏览器时,需要停止小程序的运行,此时系统就会调用stop方法以暂停小程序的运行。所以stop方法也可以被反复调用。
4.destory()方法
当用户退出浏览器的时候,浏览器运行的小程序也将停止运行、释放内存。此时浏览器会自动调用小程序对象的destory方法来完成一些释放资源、关闭链接之类的操作等。但在关闭浏览器时会先调用stop方法暂停运行小程序,然后再调用destory方法来释放被小程序所占用的资源。
从激活小程序,调用init()方法开始到结束小程序调用destory()方法为止,这一整个过程都是小程序的生命周期。
16.3 小程序的编程实例
从百年城的角度来看,小程序并没有新的内容,它只是对javax.swing.JApplet类进行扩展了的Java类。但要注意JApplet和Applet有一些区别。JApplet是Swing包中的类,它是Applet的子类。JApplet容器与Applet容器有以下不同点:
JApplet可以使用setJMenuBar()方法来添加菜单栏,而Applet不能使用菜单;
容器JApplet的默认布局管理器是BorderLayout,而容器Applet的默认布局管理是FlowLayout;
向其组件添加的方式不同,向Applet容器添加组件可以使用其add()方法进行,其格式如下:
awtApplet.add(awtComponent)
1.编写小程序的规则
必须用import命令导入javax.swing.JApplet类;
定义一个继承自JApplet的子类,并把相关的程序代码编写在这个子类中即可,且该子类型必须是public类型的,类名与文件名要一致;
由于小程序是而可以直接运行的,所以不需要main()方法;
由于JApplet类的实例是容器的类对象,所以在编写小程序时,不需要创建窗口对象,可以直接向本容器类对象中添加组件;
由于小程序具有图形界面,所以在小程序中通常用paint()方法在界面中显示文字、图形和其他元素界面。
2.向小程序传递参数
Java应用程序是通过命令行来接受用户参数的,在小程序中这个任务就是通过HTML文件的一个专门标记<Param>来完成的。
在HTML文件中通过param标记来设置要向小程序传递的参数;
小程序中只能在init()方法中调用getParameter()方法来接收HTML文件传递来的参数;
……
16.4 将应用程序转换成小程序及小程序的安全性
对于小程序的功能,主要地体现在网络中的应用,但也正是由于小程序运行环境的要求,使得java语言对小程序进行了必要的限制,其主要原因是考虑到网络上运行的安全性问题。对于应用程序和小程序,除了前面介绍的不同之处外,所有有用户接口的代码均可保持不变,所以可以将应用程序转换成小程序。
1.将应用程序转换成小程序
制作一个HTML网页文件,带有相应的标记,从而能够下载小程序的代码;
声明一个类,使其继承Applet和jApplet类。若使用swing组件,则必须继承JApplet;
在应用程序中去掉main()方法,将方法中所完成的任务分配给其他方法完成。
2. 小程序的安全性问题
作为一个可以在网络上随便利用web浏览器将小程序运送到世界各地去执行的程序而言,不能不考虑小程序在执行上的安全威胁。因此,将应用程序与小程序进行比较,可以发现java语言对小程序的限制要比对应用程序的限制严格许多。Java语言不允许一个小程序做下面的事情:
小程序不可以直接调用其他的函数库,或是调用其他语言程序编写的程序;
小程序不可以读或写本地机中的系统文件,除非是在使用者特别指定的文件夹下的文件;
除了小程序所在的位置外,小程序通常不能通过网络和其他www服务器通信;
在小程序的执行过程中,它不能再通过本地机的操作系统七五执行新的程序,如执行一个新的窗口程序;
小程序不能访问有关系统设置的任何信息,如使用者的密码文件等。
16.5 图像文件处理
在进行图形、图形文件处理的过程中,要区分图形和图像的概念。
16.6 播放音乐
目前Java语言支持多种音频格式文件。
16.7 动画程序设计
动画是Java语言最吸引人的特点之一。
//filename:Clock.java
import java.awt.*;
import java.util.*;
import javax.swing.JPanel;
import javax.swing.JApplet;
import java.text.SimpleDateFormat;
public class Clock extends JApplet implements Runnable
{
private Thread timer=null;
private int lastXh,lastYh,lastXm,lastYm,lastXs,lastYs;
private SimpleDateFormat sdf;
private NewPanel panel=new NewPanel();
public void init()
{
lastXs=lastYs=lastXm=lastYm=lastXs=lastYs=0;
setBackground(Color.WHITE);
add(panel);
//Set the print format of date
sdf=new SimpleDateFormat("yyyy yeear dd day a hh hour mm minute ss second EEEEE");
}
private class NewPanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
int xh,yh,xm,ym,xs,ys,s,m,h,xCenter,yCenter;
Calendar cal=Calendar.getInstance();
Date sdate=new Date();
String today=sdf.format(sdate);
cal.setTime(sdate);
s=cal.get(Calendar.SECOND);
m=cal.get(Calendar.MINUTE);
h=cal.get(Calendar.HOUR);
xCenter=getWidth()/2; yCenter=80;
xs=(int)(Math.cos(s*Math.PI/30-Math.PI/2)*45+xCenter);
ys=(int)(Math.sin(s*Math.PI/30-Math.PI/2)*45+yCenter);
xm=(int)(Math.cos(m*Math.PI/30-Math.PI/2)*40+xCenter);
ym=(int)(Math.sin(m*Math.PI/30-Math.PI/2)*40+yCenter);
xh=(int)((Math.cos(h*30+m/2)*Math.PI/180-Math.PI/2)*30+xCenter);
yh=(int)((Math.sin(h*30+m/2)*Math.PI/180-Math.PI/2)*30+yCenter);
g.setFont(new Font("TimesRoman",Font.PLAIN,14));
g.setColor(Color.BLUE);
g.drawOval(xCenter-52,yCenter-52,104,104);
g.setColor(Color.DARK_GRAY);
g.drawString("9",xCenter-45,yCenter+5);
g.drawString("3",xCenter+40,yCenter+3);
g.drawString("12",xCenter-7,yCenter-37);
g.drawString("6",xCenter-4,yCenter+45);
//when time changed, points need to be repaint
g.setColor(getBackground());
if(xs!=lastXs||ys!=lastYs)
{
g.fillOval(lastXs=5,lastYs-5,10,10);
g.drawLine(xCenter,yCenter,lastXs,lastYs);
}
if(xm!=lastXm||ym!=lastYm)
{
g.drawLine(xCenter,yCenter-1,lastXm,lastYm);
g.drawLine(xCenter-1,yCenter,lastXm,lastYm);
}
if(xh!=lastXh||yh!=lastYh)
{
g.drawLine(xCenter,yCenter-1,lastXh,lastYh);
g.drawLine(xCenter-1,yCenter,lastXh,lastYh);
}
g.setColor(Color.DARK_GRAY);
g.drawString(today,30,180);
g.setColor(Color.RED);
g.fillOval(xs-5,ys-5,10,10);
g.drawLine(xCenter,yCenter,xs,ys);
g.setColor(Color.BLUE);
g.drawLine(xCenter,yCenter-1,xm,ym);
g.drawLine(xCenter-1,yCenter,xm,ym);
g.drawLine(xCenter,yCenter-1,xh,yh);
g.drawLine(xCenter-1,yCenter,xh,yh);
lastXs=xs; lastYs=ys;
lastXm=xm; lastYm=ym;
lastXh=xh; lastYh=yh;
}//paintComponent() method is over
} // Inner class NewPanel is over
public void start()
{
if(timer==null)
{
timer=new Thread(this);
timer.start();
}
}
public void stop()
{
if(timer!=null)
{
timer.interrupt();
timer=null;
}
}
public void run()
{
while(timer!=null)
{
try {Thread.sleep(1000);}
catch(InterruptedException e) { }
repaint();
}
}
}
抄了好久代码,结果发现JApplet的API已经被deprecation了,自己终究还是落伍了。