Java applet详解

Java applet详解1.为啥使用applet?如果不是因为计算机二级或是某些该死的考试中需要出题,,我想我是不会理会这中东西的,毕竟这货淘汰了,为啥使用?为了考试。注:applet是和html或者是jsp一起使用的,不能单独运行(当然你可以使用appletviewer命令或者是ide去运行),具体的使用将在代码中体现。2.applet生命周期初始化init():在这个方法中可以设置一些初始值…

大家好,又见面了,我是你们的朋友全栈君。

1. 为啥使用applet?

如果不是因为计算机二级或是某些该死的考试中需要出题,,我想我是不会理会这中东西的,毕竟这货淘汰了,为啥使用?为了考试。
注:applet是和html或者是jsp一起使用的,不能单独运行(当然你可以使用appletviewer命令或者是ide去运行),具体的使用将在代码中体现。

2. applet生命周期

  1. 初始化init():在这个方法中可以设置一些初始值,像是界面的布局,会在param标签被处理后调用这个方法。
  2. 启动start():浏览器调用完init()方法后,该方法被自动调用。每当用户从其他页面返回到包含Applet的页面时,则调用该方法。
  3. 停止start():当用户从包含applet的页面移除的时候,该方法自动被调用。因此,可以在相同的applet中反复调用该方法。
  4. 销毁stop:此方法仅当浏览器正常关闭时调用。因为applets只有在HTML网页上有效,所以你不应该在用户离开包含Applet的页面后遗漏任何资源.
  5. paint():该方法在start()方法之后立即被调用,或者在applet需要重绘在浏览器的时候调用。paint()方法实际上继承于java.awt。
    如图
    这里写图片描述

3. 第一个applet程序

applet必须通过html文件使用浏览器或者是命令行中的appletviewer命令才能运行,在此使用浏览器过于麻烦,所以在下面我们都将使用命令行,来执行。

1). 建立html文件。

在java_test_two/jht文件夹中新建一个名为Hello.html的文件。

<applet code="Hello.class" height=200 width=200></applet>

上面代码中,applet标签是必须的,代表了在此处执行applet程序,而code则是程序的字节码文件名(如果有包名需要加上包名),如果是要基于根目录的(比如和html不在一个文件夹内),需要指定根目录路径,使用codebase,就像这样。
如果我的字节码文件在当前目录的app目录里面

<applet code="app.Hello.class" codebase="../app" height=200 width=200></applet>

上面的code是我所需要运行的类,如果有包名一定要加上包名,至于codebase是相对包的根目录,目录如下图
这里写图片描述
可以看到Hello.class文件是在app包中的,而app包是在java_test_two中的,而我们的Hello.html是在jht目录中的,相对于app目录需要向后退一步,才能进去app目录,而codebase就是指这个app所在的根目录,也就是java_test_two,所以,需要../来从jht回退到java_test_two目录中。才好在code中使用包名加类名。

2).建立applet

我们先在java_test_two文件夹中建立一个简单的applet,只拿标签输出一个你好。使用applet,必须继承java.applet.Applet类或者是javax.swing.JApplet,我在这里为了迎合计算机二级,就继承java.applet.Applet类。

package app;
import java.applet.Applet;
import javax.swing.JLabel;
public class Hello extends Applet{ 
   
    public void init(){
        JLabel lable = new JLabel("你好");
        add(lable);
    }
}

上面的代码是不是很简单,没错就是这样,很无语吧。

3).运行

这里的运行需要加上编码格式和-d .,编码使用utf-8是因为需要中文,-d .是因为有package app语法来生成对应的包目录。

G:\java_test_two>javac -encoding utf-8 -d . Hello.java

编译成功后会在app文件夹中生成Hello.class文件。
然后进入jht文件夹中使用

appletviewer Hello.html

命令来运行这个applet。**注意,appletviewer后面接着的是html文件,不是java的class文件!
你会发现
这里写图片描述

4.使用标签来给applet传值

在html文件中我们可以继续加入<param>标签来为applet传值。

 <param name ="aaa"value = "bbb">

设置的方法如上,这个标签是写在<applet>标签内的。
我们的html文件看来就像这样

<applet code="app.Hello.class" codebase="../" height=200 width=200>
<param name="what" value="12"/>
</applet>

那么我们如何在java代码中获取到这个值呢?

package app;
import java.applet.Applet;
import javax.swing.JLabel;
public class Hello extends Applet{ 
   
    public void init(){
        String age = getParameter("what");
        JLabel lable = new JLabel(age);
        add(lable);
    }
}

上面的代码中,使用了getParameter()方法来获取<param>标签中的值。然后放入lable中。这里为啥没通过对象调用getParameter呢?很显然,这是因为Hello继承过来了属于Applet的getParameter()方法。然后因为在运行applet的时候,首先是处理 <param>标签中的内容,然后执行init()方法里面的内容,所以,输出12。

5.applet的两种类

上面我们已经讲解了初步的运行方法和基本的代码,下面我会加快速度,不再对一些基础的地方进行解释了。
为了方便,我不再使用上面的命令行启动了,我使用myEclispse来进行编写这样然后能直接运行,这样更快。如果你没有像MyEclispse这样的ide,所谓的NetBeans也行,或者你干脆拿命令行输入appletviewer xxx.html,去启动。
1. java.applet.Applet以及javax.swing.Applet继承的类
Java.lang.Object
Java.awt.Component//组件
Java.awt.Container//容器
Java.awt.Panel//面板
Java.applet.Applet:默认的布局方式是FlowLayout
Javax.swing.JApplet:默认的布局方式是BorderLayout
2. 组件的添加
可以直接向Java.applet.Applet容器添加组件:如下

theApplet.add(Component awtComponent);//其中theApplet是Java.applet.Applet类型的对象

向Javax.swing.JApplet容器添加组件的语句格式为:

theJApplet.getContentPane().add(Component  swingComponent);
//其中theApplet是Javax.swing.JApplet类型的对象

特别注明:JApplet是顶层的Swing容器,其内部用一个隐含的根面板(JRootPanel)作为惟一的直接后代,而根面板中的内容面板(Content Pane)才是JApplet除菜单条外所有构件的双亲。由于内容面板的存在,通常对JApplet添加构件有两种方式:
1. 用getContentPane()方法获得JApplet的内容面板,再向内容面板中添加构件:

Container contentPane=getContentPane(); 
contentPane.add(SomeComponent);

2. 建立一个JPanel之类的中间容器,把构件添加到容器中,再用setContentPane()方法把该容器置为JApplet的内容面板:

JPanel contentPane=new JPanel(); contentPane.add(SomeComponent); setContentPane(contentPanel);

之后,我们仍需注意的问题是,明确区分容器和构件(组件),容器中是不能直接再添加容器的。
常用的容器有Frame(窗口容器),Panel(面板容器),Applet(java小程序的容器),Dialog(对话框容器)等。需要注意的是,applet中是直接添加不了窗体的,会爆一个这样的错误java.lang.IllegalArgumentException: adding a window to a container
上面的代码中明显区分java.applet.Appletjavax.swing.JApplet,前者能够直接添加组件,而后者需要使用面板来添加。至于后者的添加方法已经写了两种,下面我们去实践一下。

对于JApplet的第一种添加构件形式

import javax.swing.JApplet;
import javax.swing.JButton;

public class Test2 extends JApplet{ 
   
    public void init(){
        JButton button = new JButton("点我");
        getContentPane().add(button);
        add(button);
    }
}

上面代码中,运行可以看到布局是BorderLayout,getContentpane是获取当前的JApplet的面板,然后在上面添加构件JButton。(每个JApplet都有一个默认的面板)
对于JApplet的第二种添加构件的形式

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Test2 extends JApplet{ 
   
    public void init(){
        JButton button = new JButton("点我");
        JPanel panel = new JPanel();
        panel.add(button);
        setContentPane(panel);
        add(button);
    }
}

上面代码就是先设置一个面板,然后再给JApplet将这个面板设定为自己的面板,运行完后会发现布局变成了FlowLayout

6.applet去画文字和图形

Graphics类介绍
  1. Graphics类是表示applet显示区域的抽象类,它是java.awt包的部分,用于在applet的显示区域上画图。
  2. 为了在applet窗口中绘制图形,可不需要创建Graphics的实例。JApplet的paint()方法给出Graphics对象,通过使用该对象,结果就会出现在浏览器中。
  3. java的坐标系统规定在屏幕左上角为原点(0,0),正x值向右,正y值向下。所有的像素值均为整数。
  4. Graphics类提供画许多图像的方法,文本,线,圆,多边形,图像等。
画applet
  1. 当屏幕需要更新以显示新的内容,由update()和paint()方法完成。
  2. update():取Graphics类对象为参数。当applet区域需要重画时,windows系统开始画画过程。调用update()方法清除屏幕再调用paint()方法,屏幕然后由系统更新。
  3. paint()方法:取Graphics类对象为参数,在绘画区画applet的图像。
  4. 当想要重画applet的区域时调用该方法。repaint()方法是调用update()方法发出applet需要更新的信号。
  5. update()方法的缺省操作是清除applet区域和调用paint()方法,如果不想清除applet区域可以超越update()方法。
使用paint()和print帮助理解applet的生命周期
import java.awt.Graphics;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Test2 extends JApplet{ 
   
    int a = 0;
    public void init(){
        a++;
        System.out.println("init"+a);
    }
    public void start(){
        a++;
        System.out.println("start"+a);
    }

    public void stop(){
        a++;
        System.out.println("stop"+a);
    }
    public void destroy(){
        a++;
        System.out.println("destroy"+a);
    }
    public void paint(Graphics g){
        a++;
        System.out.println("paint"+a);
        g.drawString("什么神奇"+a+"次", 20, 20);
    }
}

先开始运行时在控制台输出

init1
start2
paint3

在applet中输出什么神奇3次
当你点击最小化后
会发现多了个stop4

init1
start2
paint3
stop4

当你再次最大化这个applet后

init1
start2
paint3
stop4
start5
paint6

当你关闭这个applet

init1
start2
paint3
stop4
start5
paint6
stop7
destroy8

多了最后两个吧,由此可以看出函数的调用顺序了,在此不再多说了。
上面的代码中主要是通过paint()中的Graphics对象来使用drawString方法去画字,并且指定了字的坐标。

使用repaint()和多线程来再applet中显示时钟

这个时钟就是电子表的形式,如果做成机械表的样式需要另画钟表,再此不再叙述。

import java.awt.Graphics;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JApplet;

public class Test2 extends JApplet implements Runnable{ 
   
    int a = 0;
    public void init(){
        a++;
        System.out.println("init"+a);
        Thread thread = new Thread(this);//这里的this是指当前对象,其实就是指运行的applet了,在启动时,java程序给我们自动将Test2进行实例化。这个this就指代这个实例化的对象。
        thread.start();

    }
    public void start(){
        a++;
        System.out.println("start"+a);
    }

    public void stop(){
        a++;
        System.out.println("stop"+a);
    }
    public void destroy(){
        a++;
        System.out.println("destroy"+a);
    }
    public void paint(Graphics g){
        super.paint(g);//这里得调用父类构造方法清空原来的绘图,否则是在以前的基础上画
        a++;
        System.out.println("paint"+a);
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("YY-MM-dd HH:mm:ss");
        String dates=format.format(date);
        g.drawString("什么神奇"+a+"次", 20, 20);
        g.drawString(dates,30,40);
    }
    public void run(){
        while(true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.repaint();//此处this同上
        }
    }
}

上面的代码比较容易理解,如果你多线程完全没看过的话请跳过这段代码。运行之后,会在控制台看到调用的方法。在此不再叙述了。

设置字体大小和颜色属性
  1. Graphics类和Font类和FontMetrics类结合在一起,就能在屏幕上显示文本。
  2. Font类表示一个给定的字体,它的文本类型和点的大小。
  3. FontMetrics类给出有关字体的信息,如一个给定字符的实际高度和宽度。下面我们不使用这个。
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JApplet;

public class Test3 extends JApplet { 
   
    public void init(){

    }
    public void paint(Graphics g){
        Font font = new Font("宋体",Font.BOLD,24);
        g.setFont(font);
        g.drawString("什么神奇", 40, 40);
    }
}

上面代码中先是实例化Font,然后将该对象给g.setFont(),这样就能设置字体了,然后在画出这个字体。下面就是颜色的使用。
颜色主要就是Color类,可以用下面的方法来创建颜色

Color c = new Color(0.55,0.55,0.55);

构造函数的参数是rgb值,这个值就代表了颜色。当然,Color类中也提供了静态的属性直接使用颜色名获得颜色

Color.red

使用一个Graphics类对象的方法来设置颜色:g.setColor(Color.red);
也可以设置当前applet颜色:setForeground(g.getColor());//如果已经设置了字体颜色,那个这个setForeground将不作用于字体

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JApplet;

public class Test3 extends JApplet { 
   
    public void init(){

    }
    public void paint(Graphics g){
        Font font = new Font("宋体",Font.BOLD,24);
        g.setColor(Color.red);
        g.setFont(font);
        g.drawString("什么神奇", 40, 40);
    }
}

7. AppletContext接口

  1. 使用getAppletContext()获取当前applet的上下文环境。
  2. 使用showStatus()方法改变显示在浏览器状态栏上的信息。
  3. 使用showDocument()方法请求浏览器显示一个URL地址对应的HTML文件。
    java
    showDocument(URL);
    showDocument(URL urlObj.String target);//target可以为各级窗口
  4. URL getCodeBase()是从浏览器获取applet的URL地址
  5. URL getDocumentBase()用于从浏览器获得applet所嵌入的HTML文件的URL地址。
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JApplet;

public class Test3 extends JApplet { 
   
    public void init(){
        getAppletContext().showStatus("连接中");
        try {
            getAppletContext().showDocument(new URL("http://www.baidu.com"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

上面代码是演示不出效果的,只有在浏览器中才能看到,我这里的浏览器已经全面禁止了applet,就算加载插接件也没办法。在计算机二级中,只需要死记以上几种方法的作用即可。

8.applet加载图片

  1. public URL getDocumentBase()方法:返回的是Applet类文件所在网页的网络路径。
    我们可以试着来看看。

    import java.net.URL;
    import java.awt.Graphics;
    
    import javax.swing.JApplet;
    
    public class Hello extends JApplet { 
         
        public void init(){
        }
        public void paint(Graphics g){
            URL url =getDocumentBase();
            System.out.println(url.toString());
            g.drawString(url.toString(),50,50);
        }
    }

    上面输出的结果是file:/G:/java_test_two/jht/Hello.html。这就是一个网络的url地址,也是我们文件在网络中的位置,那个这个东西有啥用呢?往下看。

  2. public Image getImage(URL url, String name)这个方法可以用来得到图片,方法中第一参数就是url,没错,需要的就是图片在网络中的地址,所以使用getDocumentBase()去获得,传到getImage中去。

    import java.net.URL;
    import java.awt.Graphics;
    import java.awt.Image;
    import javax.swing.JApplet;
    
    public class Hello extends JApplet { 
         
        public void init(){
        }
        public void paint(Graphics g){
            Image im = getImage(getDocumentBase(),"two.png");
            g.drawImage(im,0,0,this);
        }
    }

    下面是我的目录结构
    这里写图片描述
    很明显,two.png放在了和Hello.html一样的文件夹下。

9. 载入声音

  1. public AudioClip getAudioClip(URL url, String name)
    该方法返回由url和name决定的AudioClip对象。
    其中:
    (1) url:音频剪辑的绝对URL地址;
    (2) name:相对于上面的url,为音频剪辑的相对地址,通常指名字。
  2. 编写的代码

    import java.awt.*;
    import java.applet.Applet;
    public class UseAudio extends Applet { 
         
        public void init()
        {
        }
        public void start()
        {
            //播放Applet所在目录下的tiger.au声音文件
            getAudioClip(getDocumentBase(),"tiger.au").play();
        }
    };
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157065.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月8日 上午8:46
下一篇 2022年7月8日 上午8:46


相关推荐

  • JavaCV入门教程目录(JavaCV从入门到实战,JavaCV指南手册,免费JavaCV教程)

    JavaCV入门教程目录(JavaCV从入门到实战,JavaCV指南手册,免费JavaCV教程)JavaCV 入门教程 JavaCV 从入门到实战 JavaCV 指南手册 免费 JavaCV 教程 全套 JavaCV 人脸检测 训练 识别免费教程全套 JavaCV 音视频开发免费教程前言在这个 2022 年即将到来之际 博主决定将 JavaCV 大部分入门和基础内容全部开放出来 供大家一起讨论研究 只有更多人使用 交流讨论起来 技术发展才会更好 为了方便小伙伴们搜索查找 也便于统一管理 将本次开放的 JavaCV 文章单独创建了 JavaCV 免费教程大全 目录 供大家查看 开放目录 JavaCV 入门指南免费开放目录

    2026年3月17日
    2
  • 木马免杀方式_木马入侵的常见方法

    木马免杀方式_木马入侵的常见方法前言免杀,又叫免杀毒技术,是反病毒,反间谍的对立面,是一种能使病毒或木马免于被杀毒软件查杀的软件。它除了使病毒木马免于被查杀外,还可以扩增病毒木马的功能,改变病毒木马的行为。免杀的基本特征是破坏特征,有可能是行为特征,只要破坏了病毒与木马所固有的特征,并保证其原有功能没有改变,一次免杀就能完成了。免杀技术也并不是十恶不赦的,例如,在软件保护所用的加密产品(比如壳)中,有一些会被杀毒软件认为是木马病毒;一些安全领域中的部分安全检测产品,也会被杀毒软件误杀,这时就需要免杀技术来应对这些不稳定因素。1、裸

    2022年8月21日
    6
  • windows server搭建邮件服务器(开源邮件服务器系统)

    使用WinmailServer轻松架设邮件服务器准备工作  WinmailServer是一款安全易用全功能的邮件服务器软件,不仅支持SMTP/POP3/IMAP/Webmail/LDAP(公共地址簿)/多域/发信认证/反垃圾邮件/邮件过滤/邮件组/公共邮件夹等标准邮件功能,还有提供邮件签核/邮件杀毒/邮件监控/支持IIS,Apache和PWS/短信提醒/邮件备份/TLS(

    2022年4月17日
    1.3K
  • Arrays用法总结

    Arrays用法总结数组转字符串 int array newint 1 2 3 out println Arrays toString array 1 2 3 如果是一维数组 toString 方法可以很好的适用 但遇到多维数组时 需要使用 deepToString 把数组完全转成字符串 int deepArray newint 1 3

    2026年3月17日
    1
  • Python flask框架入门

    Python flask框架入门Flask 通常被称为微框架 它旨在保持应用程序的核心简单且可扩展 Flask 没有用于数据库处理的内置抽象层 也没有形成验证支持 相反 Flask 支持扩展以向应用程序添加此类功能 一些受欢迎的 Flask 扩展将在本教程后续章节进行讨论

    2026年3月26日
    1
  • JDK1.8中HashMap如何应对hash冲突?

    JDK1.8中HashMap如何应对hash冲突?1 什么是 hash 冲突我们知道 HashMap 底层是由数组 链表 红黑树构成的 当我们通过 put key value 向 hashmap 中添加元素时 需要通过散列函数确定元素究竟应该放置在数组中的哪个位置 当不同的元素被放置在了数据的同一个位置时 后放入的元素会以链表的形式 插在前一个元素的尾部 这个时候我们称发生了 hash 冲突 2 如何解决 hash 冲突事实上 想让 hash 冲突完全不发生 是

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号