|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但是对于JAVA技术类的学习,我觉得大课堂反而会影响自身独立思考的过程,因为上课的时候,老师讲课的速度很快为了不遗漏要点,通常会仔细的听,编程|技能1.JavaApplet概述
JavaApplet程序分为两类:Java小程序(Applet)和Java应用程序(Application),这两类程序是有区别的。JavaApplet嵌进在WWW的页面,作为页面的组成部分被下载,并能运行在实现Java虚机器(JVM)的Web浏览器中。Java的安全机制可以防止小程序存取本地文件或其他安全方面的问题。而一个Java应用程序运行于Web浏览器之外,没有Applet运行时的诸多限制。另外,两者程序设计上的最年夜区别在于:JavaApplet没有主程序,而Java应用程序一定要有主程序。在Java中每个applet都是由Applet的子类来实现。开发人员自定义的applet通过重载Applet的几个主要成员函数完成小应用程序的初始化、绘制和运行。这些函数是init()、paint()、start()、stop()和destory()。
一个applet的生命周期与Web页面有关。当首次加载含applet的页面时,浏览器调用init()方法,完成applet的初始化。然后调用paint()或start()方法绘制或启动程序。当用户离开页面时,浏览器调用stop()方法停止小程序运行。若用户关闭浏览器将使applet停止运行,浏览器调用destory()方法终止,使小应用程序有机会释放其存在期间锁定的资源。只要用户不关闭浏览器,重新加载页面,浏览器则只调用start()方法和paint()方法重新绘制并运行小程序。Applet生命周期如所示。
2.扩展小程序基类支持多线程
通常情况下,设计小程序是为了给主页增加交互性,使页面更加生动活泼。因此,那些真正有用小程序,如动画、实时更新Internet服务器信息回取、一般娱乐等通常都是持续运行的,即小程序的逻辑主体存在着无限循环。这个逻辑主体不宜放在几个浏览器调用方法中,如init()、paint()、
start()等。这是因为隐含情况下,小程序所有主逻辑都采用单一线程。当浏览器调用方法中出现逝世循环,则程序控制不返回。如果用户换到另一个页面之后小程序还在运行,就会浪费处理器资源。你可以做一个实验,使用小程序查阅器运行小程序,你会发现查阅器本身完全停止作用,因为它要等到调用函数返回后,才能继续处理其他事情(如响应菜单)。显然,这个逻辑主体必须放在其他地方。解决方法是在小程序框架中加进线程,把逻辑主体放在线程run()方法中。只在浏览器调用方法start()中生成线程,而在
stop()中终止线程运行,这样当用户不查阅时不会占用处理器资源。表示浏览器、小程序和线程之间的关系。
由于浏览器/小程序/线程是所有浏览器都采用的模型,而Java.applet.Applet类本身并不支持线程。在实际使用中,为方便操作,我们可以派生Applet类生成一个支持线程的子类,今后再编写applet时,就可以直接从子类中派生,程序逻辑主体放在run()方法中,将线程控制隐躲起来。这个子类如下:
importJava.applet.*;
importJava.awt.*;
classMultiThreadAppletextendsAppletimplementsRunnable{
ThreadthisThread;
Publicvoidstart(){if(thisThread==null){
thisThread=newThread(this);
thisThread.start();{
}
publicvoidstop(){
if(thisThread!=null){
thisThread.stop();
thisThread=null;}
}
publicvoidrun(){}}
由于run()是接口Runnable的抽象方法,所以在MultiThreadApplet类中也需要进行定义,只不过内容为空。下面的例子显示如何使用这个类。程序包含一个无限循环累加操作,并将结果显示在屏幕上:
importjava.awt.*;
publicclasscounterextendsMultiThreadApplet{
intCounter;
publicvoidrun(){
while(true){
counter++;
repaint();}
}
publicvoidpaint(Graphicsg){
g.drawString(string.valueof(counter),10,10);{
}
很显然,这个小程序对线程的操作已被隐躲在MultiThreadApplet中。
3.解决动画中的一些问题
动画的本质就是运动的图形,一系列连续显示的静止图形会给我们一种连续动画的假象。只要动画速度足够快,则分散的静止图形就会合并成一个连续运动的流程。
绘制动画十分简单,只需遵照以下三步即可;(1)擦往整个小程序绘图区;(2)重画动画背景;(3)在新的位置绘制图形。但是,当动画连续帧之间运动和颜色不连续时就会发生闪烁现象(例子略)。问题出在小程序区的屏幕刷新上,有两种方法可以防止动画闪烁。第一种方法是只做局部刷新,即每次只擦除改变的部分。例如:如果要绘制一幅"飞行的星空"动画,每次刷新操作,先擦往前一位置的星星,再在新的位置绘制一个。但是,如果动画比较复杂,运动部分重叠较多,则局部刷新操作很繁琐也影响程序运行速度。在这种情况下,可以用另外一种方法(双缓存)来解决闪烁问题。它的核心思想是在屏幕外完成一帧的全部动画,然后把最后绘制完的帧显示在小程序屏幕上。过程如所示。
示例程序如下:
importjava.awt.*;
publicclassBallextendsMultiThreadApplet{
Imageball=null;
Imageapplet=null;
GraphicsappletG,ballG;
Publicvoidrun(){
If(ball==null){
Applet=createlmage(bounds().width,bounds().
Height);
Ball=createImage(70,70);
AppletG=applet.getGraphics();
BallG=ball.getGraphics();
BallG.setColor(Color.gray);
BallG.drawOral(0,0,70,70);{
For(intx=0;x<400;x++){Doubleangle="((double)x)/20;"Inty="(int)(Math.abs(Math.sin(angle))*80);"AppletG.clearRect(0,0,bounds().width.bounds(),Helght);DrawBackground(appletG);AppletG.drawImage(ball,x.80-y,this);This.getGraphics().drawImage(applet,0,0,this);Try{Thread.sleep(25);}catch(Exceptionignored){}}}privatevoiddrawBackground(Graphicsg){for(intI="0;I"<1;I++){g.drawLine(0.i*10,400,I*10);}}}
小程序首先用createImage()取得与小程序年夜小完全相同的屏外图形缓存,赋给变量applet,然后得到缓存的绘图对象appletG。以后对帧的刷新操作过程都是针对appletG。这包括清除帧、绘制背景、在新位置绘制图形。最初再用drawImage()方法把缓存复制到小程序的屏幕显示区。运行这个小程序,你会发现动画非常平滑,不存在闪烁现象。
除了闪烁之外,如果动画过于复杂,帧速率就可能降低。若动画降到每秒20,帧是动画会出现间断现象影响显示效果。因此有必要优化动画速度,下面列出了一些可行的方案;(1)画得尽可能少;(2)用较快的绘图算法;(3)用颜色循环等技巧来绘画某一部分;(4)用图案来表示细节;(5)用定点整数进行三维计算;(6)用查询的预先计算结果来处理复杂算法。
4.缩短小程序装进时间
真正功能性的小程序本身并不小,这就意味着小程序从Internet上下载需要花很多时间。随着小程序的普及,越来越多的Internet频带被用于从各地的服务器向客户端Web浏览器传送这些小程序,因此响应时间进一步下降。为了缩短小程序下载和装进时间,可以采取以下3种方法。
使执行文件尽量小尽管Internet(TCP协议)可以接受任意长度的数据流,但负责点对点传送的网络设备(例如:路由器)对一次传送分组包的上限有严格的限制,通常这一限制是256的整数倍。因此,当小程序在网上传送时,按照上限它被分成若干包,而最后一个包可能只有几个字节。这些包是单独传送,需要在客户端重新组装为原先小程序执行文件字节流。当最后一个包延迟时,可能要用好几秒来等待最后几个字节到达。唯一的解决办法就是保持类文件尽量小。开发人员可以在不影响程序逻辑主体的前提下尝试下列方案:(1)删除查错代码;(2)缩小String直接量;(3)选择Java编译器优化编译选项;(4)删除用不到的方法等。
类散保持在可控范围内几乎没有一个小程序是由一个类组成。通常,开发人员为了实现一个功能较强的小程序需要从标准的Java基类中派生出若干子类,并对之进行组合。因此,若要使一个小程序运行,Java虚拟机就要分别下载并装进这些类。如果实现中类的数目较多,下载的时间也就相应较长。我们都知道,下载20个独立的数据块比下载一个相当于20个数据块之和的年夜数据块要花费更多的时间,这是由于下载每个独立数据块都要重新进行网络联接,而进行每次联接都要花费时间的缘故。因此,开发人员在设计小程序时,类的数目要选择适中,即可保证结构层次清晰,又要保证程序精简,不增加冗余。
缩短小程序初始化时间用户讨厌等待,因此,程序下载后应尽量缩短初始化时间。如果预处理工作较多,可以用辅助线程先同用户进行交互,例如:问候用户、询问用户姓名、显示进程指示等。总之,让用户"忙起来"。同时,小程序主线程可以继续在后台做初始化工作。有句话请记住:"高兴时时间过得快",充分利用这一现象可以改变用户对小程序装进时间的感觉。
学习JAVA的目的更多的是培养自身的工作能力,我觉得工作能力的一个核心就是:独立思考能力,因为只有独立思考后,才会有自己的见解 |
|