欢迎大家光临【无师自通-教程网】您的到来是我们的荣幸。本站提供photoshop教程,ps教程,flash教程,cad教程,网页制作教程,excel教程,asp教程,vb教程,3d教程,c语言教程,html教程,coreldraw教程,dreamweaver教程,java教程,3dmax教程 等各种教程为主题的内容和服务,相信您会在这里找到您所需要的东东。无师自通伴您一生-谢谢您的光临!!
网站地图 设为首页
简繁切换 加入收藏
栏目待定 留言本站
您现在的位置: 无师自通-教程网 >> 程序设计 >> JAVA教程 >> APPLET >> 教程正文

  没有公告

教程: JAVA Applet教程-Java Applet编程技巧 更多...
教程: JAVA Applet教程-Java Applet编程技巧

· 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生命周期如图1所示。

· 2.扩展小程序基类支持多线程

通常情况下,设计小程序是为了给主页增加交互性,使页面更加生动活泼。因此,那些真正有用小程序,如动画、实时更新Internet服务器信息回取、一般娱乐等通常都是持续运行的,即小程序的逻辑主体存在着无限循环。这个逻辑主体不宜放在几个浏览器调用方法中,如init()、paint()、
start()等。这是因为隐含情况下,小程序所有主逻辑都采用单一线程。当浏览器调用方法中出现死循环,则程序控制不返回。如果用户换到另一个页面之后小程序还在运行,就会浪费处理器资源。你可以做一个实验,使用小程序查阅器运行小程序,你会发现查阅器本身完全停止作用,因为它要等到调用函数返回后,才能继续处理其他事情(如响应菜单)。显然,这个逻辑主体必须放在其他地方。解决方法是在小程序框架中加入线程,把逻辑主体放在线程run()方法中。只在浏览器调用方法start()中生成线程,而在
stop()中终止线程运行,这样当用户不查阅时不会占用处理器资源。图2表示浏览器、小程序和线程之间的关系。

由于浏览器/小程序/线程是所有浏览器都采用的模型,而Java.applet.Applet类本身并不支持线程。在实际使用中,为方便操作,我们可以派生Applet类生成一个支持线程的子类,今后再编写applet时,就可以直接从子类中派生,程序逻辑主体放在run()方法中,将线程控制隐藏起来。这个子类如下:

import Java.applet.*;
import Java.awt.*;
class MultiThreadApplet extends Applet implements Runnable {
Thread thisThread;
Public void start( ) { if(thisThread==null) {
thisThread=new Thread(this);
thisThread.start( );{
}
public void stop( ) {
if (thisThread! =null) {
thisThread.stop( );
thisThread=null;}
}
public void run ( ) {}}

由于run()是接口Runnable的抽象方法,所以在MultiThreadApplet类中也需要进行定义,只不过内容为空。下面的例子显示如何使用这个类。程序包含一个无限循环累加操作,并将结果显示在屏幕上:

import java.awt.*;
public class counter extends MultiThreadApplet{
int Counter;
public void run( ){
while(ue){
counter ;
repaint( );}
}
public void paint(Graphics g) {
g.drawSing(sing.valueof(counter),10,10);{
}

很显然,这个小程序对线程的操作已被隐藏在MultiThreadApplet中。

· 3.解决动画中的一些问题

动画的本质就是运动的图形,一系列连续显示的静止图形会给我们一种连续动画的假象。只要动画速度足够快,则分散的静止图形就会合并成一个连续运动的流程。

绘制动画十分简单,只需遵照以下三步即可;(1)擦去整个小程序绘图区;(2)重画动画背景;(3)在新的位置绘制图形。但是,当动画连续帧之间运动和颜色不连续时就会发生闪烁现象(例子略)。问题出在小程序区的屏幕刷新上,有两种方法可以防止动画闪烁。第一种方法是只做局部刷新,即每次只擦除改变的部分。例如:如果要绘制一幅"飞行的星空"动画,每次刷新操作,先擦去前一位置的星星,再在新的位置绘制一个。但是,如果动画比较复杂,运动部分重叠较多,则局部刷新操作很繁琐也影响程序运行速度。在这种情况下,可以用另外一种方法(双缓存)来解决闪烁问题。它的核心思想是在屏幕外完成一帧的全部动画,然后把最后绘制完的帧显示在小程序屏幕上。过程如图3所示。

示例程序如下:

import java.awt.*;
public class Ball extends MultiThreadApplet {
Image ball=null;
Image applet=null;
Graphics appletG,ballG;
Public void run( ){
If(ball= =null){
Applet=createlmage(bounds( ).width,bounds( ).
Height);
Ball=create Image(70,70);
AppletG=applet.getGraphics( );
BallG=ball.getGraphics( );
BallG.setColor(Color.gray);
BallG.drawOral(0,0,70,70); {
For(int x=0;x <400;x ) { Double angle="((double)x)/20;" Int y="(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(Exception ignored) {}} } private void drawBackgr

[1] [2] 下一页

教程录入:admin    责任编辑:admin 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
     
     
     

    access基础知识
    免责声明!本站资料大部分来自于互联网,其版权归原作者或其他合法者所有.如内容涉及或侵犯了您的权益,请通知本人,我将尽快处理!.欢迎您的光临。
    辽ICP备07003958号
    无师自通,伴你一生-教程网