前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java applet详解

Java applet详解

作者头像
全栈程序员站长
发布2022-09-08 10:27:08
1.3K0
发布2022-09-08 10:27:08
举报
文章被收录于专栏:全栈程序员必看

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

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的文件。

代码语言:javascript
复制
<applet code="Hello.class" height=200 width=200></applet>

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

代码语言:javascript
复制
<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类。

代码语言:javascript
复制
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语法来生成对应的包目录。

代码语言:javascript
复制
G:\java_test_two>javac -encoding utf-8 -d . Hello.java

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

代码语言:javascript
复制
appletviewer Hello.html

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

4.使用标签来给applet传值

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

代码语言:javascript
复制
 <param name ="aaa"value = "bbb">

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

代码语言:javascript
复制
<applet code="app.Hello.class" codebase="../" height=200 width=200>
<param name="what" value="12"/>
</applet>

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

代码语言:javascript
复制
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容器添加组件:如下

代码语言:javascript
复制
theApplet.add(Component awtComponent);//其中theApplet是Java.applet.Applet类型的对象

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

代码语言:javascript
复制
theJApplet.getContentPane().add(Component  swingComponent);
//其中theApplet是Javax.swing.JApplet类型的对象

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

代码语言:javascript
复制
Container contentPane=getContentPane(); 
contentPane.add(SomeComponent);

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

代码语言:javascript
复制
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的第一种添加构件形式

代码语言:javascript
复制
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的第二种添加构件的形式

代码语言:javascript
复制
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的生命周期
代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
init1
start2
paint3

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

代码语言:javascript
复制
init1
start2
paint3
stop4

当你再次最大化这个applet后

代码语言:javascript
复制
init1
start2
paint3
stop4
start5
paint6

当你关闭这个applet

代码语言:javascript
复制
init1
start2
paint3
stop4
start5
paint6
stop7
destroy8

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

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

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

代码语言:javascript
复制
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类给出有关字体的信息,如一个给定字符的实际高度和宽度。下面我们不使用这个。
代码语言:javascript
复制
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类,可以用下面的方法来创建颜色

代码语言:javascript
复制
Color c = new Color(0.55,0.55,0.55);

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

代码语言:javascript
复制
Color.red

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

代码语言:javascript
复制
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地址。
代码语言:javascript
复制
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加载图片

9. 载入声音

public AudioClip getAudioClip(URL url, String name)

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 为啥使用applet?
  • 2. applet生命周期
  • 3. 第一个applet程序
  • 4.使用标签来给applet传值
  • 5.applet的两种类
  • 6.applet去画文字和图形
  • 7. AppletContext接口
  • 8.applet加载图片
  • 9. 载入声音
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档