【Java】Applet开发
一、Applet开发环境准备
IDEA在2018版本默认提供了Applet启动配置
创建一个Applet应用配置:
在IDEA2019版本之后,这个应用配置选项被移除了,改为Java Applet Support插件来提供支持
插件支持在2019版本和之后所有版本(猜测)适用
参考博客:
https://blog.csdn.net/yuanzic1/article/details/121277865
二、Applet快速上手
1、创建一个普通Class类文件,然后编写Applet应用代码:
package cn.cloud9.applet; import java.applet.Applet; import java.awt.*; /** * @projectName: Applet * @author: Cloud9 * @date: 2022年08月30日 09:13 * @version: 1.0 */ public class QuickStartApplication extends Applet { @Override public void paint(Graphics graphics) { graphics.drawString ("Hello Java Applet", 25, 50); } }
2、打开运行配置编辑框,创建一个Applet应用
执行方式分为两种
- 指定Applet类执行
- 指定内嵌定位了的Applet类的HTML文件执行
首先选择第一种读取Applet类执行
注意追加AppletViewer启动参数:
-Dfile.encoding=GBK
AppletViewer默认窗口渲染的字体编码跟随操作系统,也就是GBK
最后是指定JRE的HOME目录,一般默认即可
如果不追加编码参数,则渲染窗口的选项卡文本乱码
上述参数配置完成后保存,然后直接启动即可运行:
3、以HTML文件方式执行Applet
在Resource目录下新建HTML文件
- 编写普通HTML文档标记代码
- 在Body标签中编写Applet标签,必须指定code属性和宽度高度属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>Java Applet HTML页面测试</h3> <hr> <applet code="cn.cloud9.applet.QuickStartApplication.class" width="320" height="120" ></applet> </body> </html>
code属性声明目标的资源位置,因为html文件并不和Applet在同一个包下
所以需要声明完整的类路径
可以再追加codebase属性,声明class文件的根目录位置:
<applet code="cn.cloud9.applet.QuickStartApplication.class" codebase="./" width="320" height="120" ></applet>
配置HTML方式的启动项:
运行结果:
好像除了Applet的资源外,HTML代码不渲染解析,和直接加载Applet类文件没有区别
三、Applet的生命周期
Applet生命周期对应了这4个方法
- init 初始化Applet实例
- start 实例初始化完成,开始加载
- stop 实例停止执行
- destory 应用关闭,实例停止后销毁
- paint 该方法在start()方法之后立即被调用,或者在applet需要重绘在浏览器的时候调用
package cn.cloud9.applet; import java.applet.Applet; import java.awt.*; /** * @projectName: Applet * @author: Cloud9 * @date: 2022年08月30日 09:58 * @version: 1.0 */ public class AppletLifeCycle extends Applet { @Override public void paint(Graphics graphics) { graphics.drawString ("Hello Java Applet", 25, 50); } @Override public void init() { System.out.println("Applet 初始化... "); } @Override public void start() { System.out.println("Applet 初始完毕 开始执行 用户访问Applet页面 ... "); } @Override public void stop() { System.out.println("Applet 停止运行 用户从Applet页面跳转... "); } @Override public void destroy() { System.out.println("Applet 实例被销毁 用户退出了Applet应用... "); } }
配置AppletViewer启动项运行后,可以使用Viewer的调试选项:
通过上述的几个选项,可以在控制台输出中查看对应的周期方法触发
四、参数获取
创建一个参数获取的Applet类:
getParameter方法可以读取html标签上设置的param标签信息
package cn.cloud9.applet; import java.applet.Applet; import java.awt.*; /** * @projectName: Applet * @author: Cloud9 * @date: 2022年08月30日 10:18 * @version: 1.0 */ public class AppletParamsGet extends Applet { @Override public void paint(Graphics graphics) { graphics.drawString ("Hello Java 参数读取", 25, 50); // 获取单个具体参数 String username = getParameter("username"); String password = getParameter("password"); String email = getParameter("email"); System.out.println("username -> " + username); System.out.println("password -> " + password); System.out.println("email -> " + email); } @Override public void init() { System.out.println("Applet 初始化... "); } @Override public void start() { System.out.println("Applet 初始完毕 开始执行 用户访问Applet页面 ... "); } @Override public void stop() { System.out.println("Applet 停止运行 用户从Applet页面跳转... "); } @Override public void destroy() { System.out.println("Applet 实例被销毁 用户退出了Applet应用... "); } }
编写对应的HTML文件:
在applet标签嵌套的内容中编写param标签,分为Name和Value两个属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <applet code="cn.cloud9.applet.AppletParamsGet.class" codebase="./" width="320" height="120" > <param name="username" value="张三"/> <param name="password" value="qwer1234!@#$"/> <param name="email" value="1791255334@qq.com"/> </applet> </body> </html>
启动测试结果:
username -> 寮犱笁 password -> qwer1234!@#$ email -> 1791255334@qq.com
五、事件监听
重写鼠标监听适配器抽象类
package cn.cloud9.applet.listener; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; /** * @projectName: Applet * @author: Cloud9 * @date: 2022年08月30日 10:54 * @version: 1.0 */ public class MyMouseListener implements MouseListener { /** * * 鼠标点击事件 左键右键都监听 * @param e * @return void * @author Cloud9 * @createTime 2022/8/30 10:53 * */ @Override public void mouseClicked(MouseEvent e) { Point point = e.getPoint(); int x = point.x; int y = point.y; System.out.printf("点击事件触发! 坐标 %d, %d \n", x, y); } /** * * 鼠标键按下 * @param e * @return void * @author Cloud9 * @createTime 2022/8/30 10:53 * */ @Override public void mousePressed(MouseEvent e) { Point point = e.getPoint(); int x = point.x; int y = point.y; System.out.printf("鼠标按下事件触发! 坐标 %d, %d \n", x, y); } /** * * 鼠标键释放 * @param e * @return void * @author Cloud9 * @createTime 2022/8/30 10:52 * */ @Override public void mouseReleased(MouseEvent e) { Point point = e.getPoint(); int x = point.x; int y = point.y; System.out.printf("鼠标按键释放事件触发! 坐标 %d, %d \n", x, y); } /** * * 鼠标进入 * @param e * @return void * @author Cloud9 * @createTime 2022/8/30 10:52 * */ @Override public void mouseEntered(MouseEvent e) { Point point = e.getPoint(); int x = point.x; int y = point.y; System.out.printf("鼠标进入窗口事件触发! 坐标 %d, %d \n", x, y); } /** * * 鼠标退出 * @param e * @return void * @author Cloud9 * @createTime 2022/8/30 10:52 * */ @Override public void mouseExited(MouseEvent e) { Point point = e.getPoint(); int x = point.x; int y = point.y; System.out.printf("鼠标退出窗口事件触发! 坐标 %d, %d \n", x, y); } }
在Applet应用类初始化时,注册自定义的监听器实现类
package cn.cloud9.applet; import cn.cloud9.applet.listener.MyMouseListener; import java.applet.Applet; import java.awt.*; /** * @projectName: Applet * @author: Cloud9 * @date: 2022年08月30日 10:47 * @version: 1.0 */ public class AppletEventListen extends Applet { @Override public void paint(Graphics graphics) { graphics.drawString ("Hello Java Applet", 25, 50); } @Override public void init() { System.out.println("Applet 初始化... "); // 添加事件监听处理 this.addMouseListener(new MyMouseListener()); } @Override public void start() { System.out.println("Applet 初始完毕 开始执行 用户访问Applet页面 ... "); } @Override public void stop() { System.out.println("Applet 停止运行 用户从Applet页面跳转... "); } @Override public void destroy() { System.out.println("Applet 实例被销毁 用户退出了Applet应用... "); } }
监听鼠标点击和在窗口中的事件:
这里只是以鼠标监听事件为例,下面还有这些监听事件类:
六、加载图片
resources目录存放一张java.jpg
resources/image/java.jpg
图片Applet类编写:
package cn.cloud9.applet; import java.applet.Applet; import java.applet.AppletContext; import java.awt.*; import java.net.MalformedURLException; import java.net.URL; /** * @projectName: Applet * @author: Cloud9 * @date: 2022年08月30日 11:28 * @version: 1.0 */ public class AppletShowImage extends Applet { private AppletContext appletContext; private Image image; @Override public void paint(Graphics graphics) { appletContext.showStatus("Displaying image"); graphics.drawImage(image, 0, 0, 266, 413, null); graphics.drawString("www.javalicense.com", 50, 414); } @Override public void init() { appletContext = this.getAppletContext(); String appletInfo = this.getAppletInfo(); System.out.println("Applet 初始化... " + appletInfo); String imageUrl = this.getParameter("image"); if (null == imageUrl) imageUrl = "./image/java.jpg"; URL documentBase = this.getDocumentBase(); try { URL url = new URL(documentBase, imageUrl); image = appletContext.getImage(url); } catch (MalformedURLException e) { e.printStackTrace(); } } }
HTML文件编写:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <applet code="cn.cloud9.applet.AppletShowImage.class" width="420" height="420" > <param name="image" value="./image/java.jpg" /> </applet> </body> </html>
加载效果,但是发现默认不展示,需要通过拖拽窗口触发重新渲染或者点击启动调试才可以
7、加载音频
音频Applet代码:
注意,Applet读取音频文件,只能播放au音频
在线音频转换地址: https://convertio.co/zh/
package cn.cloud9.applet; import java.applet.Applet; import java.applet.AppletContext; import java.applet.AudioClip; import java.net.MalformedURLException; import java.net.URL; /** * @projectName: Applet * @author: Cloud9 * @date: 2022年08月30日 13:57 * @version: 1.0 */ public class AudioApplet extends Applet { private AudioClip audioClip; private AppletContext appletContext; @Override public void init() { appletContext = this.getAppletContext(); String audioUrl = this.getParameter("audio"); if (null == audioUrl) audioUrl = "./audio/tip-sound.au"; try { URL url = new URL(this.getDocumentBase(), audioUrl); audioClip = appletContext.getAudioClip(url); } catch (MalformedURLException e) { e.printStackTrace(); appletContext.showStatus("Could not load audio file!"); } } @Override public void start() { if (null != audioClip) audioClip.loop(); } @Override public void stop() { if (null != audioClip) audioClip.stop(); } }
HTML文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <applet code="cn.cloud9.applet.AudioApplet.class" width="420" height="420" > <param name="audio" value="./audio/tip-sound.au" /> </applet> </body> </html>