32、Java动画编程与Java Web Start新特性

Java动画编程与Java Web Start新特性

1. Java动画编程基础

在Java编程中,动画效果的实现往往涉及到图像的加载、显示和移动。下面将详细介绍两种不同的动画实现方式。

1.1 存储和显示一组相关图像

在Animate小程序中,图像被加载到一个名为 pictures Image 对象数组中。程序的第6行将 pictures 数组设置为可以处理6个元素,因此数组索引范围是从 picture[0] picture[5] 。在小程序的 paint() 方法中,使用以下语句来显示当前图像:

screen.drawImage(picture[current], 0, 0, this);

其中, current 变量用于记录在 paint() 方法中要显示的图像。它的初始值为0,所以第一个显示的图像是存储在 picture[0] 中的图像。在 run() 方法的第45行调用 repaint() 语句后,第46行将 current 变量的值加1。

totalPictures 变量是一个整数,用于记录应该显示的图像数量。当从网页参数加载图像时,会设置该变量的值。当 current 等于 totalPictures 时, current 会被重置为0,这样就可以循环显示动画中的每个图像。

要测试这个小程序,需要创建一个包含图像文件名的网页。具体步骤如下:
1. 保存并编译 Animate.java 文件。
2. 在文字处理器中创建一个新文件,命名为 Animate.html ,并输入以下内容:

1: <applet code=”Animate.class” width=215 height=298>
2: <param name=”image0” value=”lh0.gif”>
3: <param name=”image1” value=”lh1.gif”>
4: <param name=”image2” value=”lh2.gif”>
5: <param name=”image3” value=”lh3.gif”>
6: <param name=”pause” value=”800”>
7: </applet>

这个文件指定了四个图像文件: lh0.gif lh1.gif lh2.gif lh3.gif 。可以在特定网站上找到这些示例文件,也可以指定自己的 .GIF .JPG 文件,但这些文件应与 Animate.class Animate.html 文件放在同一文件夹中。通过“pause”参数,可以指定每次显示图像后程序应暂停的时间。

完成上述操作后,在浏览器中输入以下命令来打开页面并查看小程序:

Animate.html

虽然这是一个简单的动画程序,但网络上有数百个小程序使用类似的功能将一系列图像文件呈现为动画。与常见的动画 .GIF 文件相比,Java小程序加载速度可能较慢,但可以提供更多的动画控制和更复杂的效果。

1.2 让网球在屏幕上弹跳

接下来,我们将实现一个网球在屏幕上弹跳的动画,这个动画无法用动画 .GIF 文件或其他非编程方式复制。具体步骤如下:
1. 在文字处理器中创建一个新文件,命名为 BouncePanel.java ,并输入以下内容:

1: import java.awt.*;
2: import javax.swing.*;
3: import java.util.*;
4:
5: public class BouncePanel extends JPanel implements Runnable {
6:     Image ball, court;
7:     float current = 0F;
8:     Thread runner;
9:     int xPosition = 10;
10:     int xMove = 1;
11:     int yPosition = -1;
12:     int ballHeight = 185;
13:     int ballWidth = 190;
14:     int height;
15:
16:     public BouncePanel() {
17:         super();
18:         Toolkit kit = Toolkit.getDefaultToolkit();
19:         ball = kit.getImage(“tennis.gif”);
20:         court = kit.getImage(“court.jpg”);
21:         runner = new Thread(this);
22:         runner.start();
23:     }
24:
25:     public void paintComponent(Graphics comp) {
26:         Graphics2D comp2D = (Graphics2D) comp;
27:         height = getSize().height - ballHeight;
28:         if (yPosition == -1)
29:             yPosition = height - 20;
30:         if ((court != null) && (ball != null)) {
31:             comp2D.drawImage(court, 0, 0, this);
32:             comp2D.drawImage(ball,
33:                (int) xPosition,
34:                (int) yPosition,
35:                this);
36:         }
37:     }
38:
39:     public void run() {
40:         Thread thisThread = Thread.currentThread();
41:         while (runner == thisThread) {
42:             current += (float) 0.1;
43:             if (current > 3)
44:                 current = (float) 0;
45:             xPosition += xMove;
46:             if (xPosition > (getSize().width - ballWidth))
47:                 xMove *= -1;
48:             if (xPosition < 1)
49:                 xMove *= -1;
50:             double bounce = Math.sin(current) * height;
51:             yPosition = (int) (height - bounce);
52:             repaint();
53:             try {
54:                 Thread.sleep(100);
55:             } catch (InterruptedException e) { }
56:         }
57:     }
58: }
  1. 保存并编译该文件。
  2. 再创建一个新文件,命名为 Bounce.java ,并输入以下内容:
1: import java.awt.*;
2: import javax.swing.*;
3:
4: public class Bounce extends JFrame {
5:     public Bounce() {
6:         super(“Tennis”);
7:         setSize(550, 450);
8:         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
9:         BouncePanel boing = new BouncePanel();
10:         Container pane = getContentPane();
11:         pane.add(boing);
12:         setContentPane(pane);
13:         setVisible(true);
14:     }
15:
16:     public static void main(String[] arguments) {
17:         Bounce frame = new Bounce();
18:     }
19: }
  1. 保存该文件后,从特定网站获取 tennis.gif court.gif 文件,并将它们放在与 Bounce.class BouncePanel.class 文件相同的文件夹中。
  2. 最后,在命令行中输入以下命令来运行 Bounce 应用程序:
java Bounce

这个应用程序在 BouncePanel 组件上显示动画:一个网球的 .GIF 文件在一个描绘球网的 .GIF 文件前来回弹跳。当球碰到框架的底部边缘时,它会向上反弹接近顶部边缘;当球碰到左右边缘时,它会向相反方向弹跳。

BouncePanel 类中的动画序列展示了如何使用Java对图像文件进行动画处理,具体步骤如下:
1. 在当前位置绘制球。
2. 根据已建立的球的移动规则移动球。
3. 根据球的新位置检查是否需要更改规则。
4. 重复上述步骤。

BouncePanel 类是线程化的,因此所有的图像操作代码都放在 run() 方法中,该方法将在线程启动时被调用。 paintComponent() 方法用于绘制球场,然后在当前位置绘制球。

在这个类中,使用了几个变量来跟踪球的位置和当前移动速度:
| 变量名 | 含义 |
| ---- | ---- |
| xPosition | 球应该绘制的x坐标,初始值为10 |
| xMove | 每次屏幕更新后球在x轴上应该移动的量,初始值为1,当球碰到小程序窗口的右边缘时会变为 -1,每次碰到边缘时会在 -1 和 1 之间切换 |
| yPosition | 球应该绘制的y坐标,初始值为 -1,这是一个信号,告诉 paint() 方法在第一次绘制球之前需要设置 yPosition 的值,其值从应用程序框架底部附近的点到顶部边缘变化 |
| current | 一个浮点数,初始值为0,每次重绘球时增加0.1,当达到3时重置为0,用于与数学正弦函数一起确定球的弹跳高度 |

2. Java动画编程常见问题解答

以下是一些关于Java动画编程的常见问题及解答:
- 问题1:线程化的动画程序是否必须使用 Thread.sleep() 来暂停,还是可以省略它以产生最快的动画效果?
- 解答 :在动画程序中必须设置某种暂停机制,否则程序可能会崩溃或表现不稳定。如果没有暂停,Java将无法跟上持续的 repaint() 请求,并且可能无法响应其界面上的鼠标点击和其他用户输入。在Java中,动画设计的一部分就是找到所有环境都能处理的合适显示速度。
- 问题2:如果将某个东西(如图像)绘制到不在窗口内的坐标上会发生什么?
- 解答 :将某个东西绘制到坐标的方法会继续绘制它,即使在小程序窗口或应用程序框架显示的区域内看不到它。这是让某个东西进入视野的一种好方法,因为落入可见区域的图像部分将被显示。

3. Java动画编程小测验

以下是一些测试你Java动画编程技能的问题:
1. 容器上的(0,0)坐标在哪里?
- a. 在屏幕外的双缓冲区域
- b. 窗口的正中心
- c. 容器的左上角
2. 在这部分内容中,你没有学到以下哪件事?
- a. 如何在应用程序中加载图像
- b. 如何确保图像在加载完成后才显示
- c. 为什么在 BouncePanel 应用程序中网球是在稀薄的空气中弹跳而不是在地面上弹跳
3. 在线程化的动画小程序中,应该在哪里处理图像的大部分移动?
- a. run() 方法
- b. init() 方法
- c. paint() 方法

答案
1. c。x值向右增加,y值向下增加。
2. c。
3. a。虽然 paint() 方法中的语句可能会处理一些移动,但大部分移动将在 run() 方法或从 run() 方法中调用的方法中进行。

4. Java动画编程活动建议

在掌握了上述Java动画编程知识后,你可以尝试以下活动:
- 创建一个包含 BouncePanel 组件和滑块或文本字段的小程序,在其中可以将动画速度从100更改为其他值。
- 创建一个将Animate项目作为应用程序而不是小程序运行的版本。
你可以访问特定网站查看实现这些活动的Java程序。

5. Java 2版本1.4的新特性 - Java Web Start

Java 2的每个新版本都包含数十个新特性,其中Java Web Start是一个重要的新特性,它允许通过在Web浏览器中点击链接来安装和运行应用程序,这将改变程序员分发应用程序的方式。

5.1 Java程序的分发方式

作为Java程序员,需要考虑如何将软件提供给用户。应用程序需要Java解释器,因此可以选择将其包含在应用程序中,或者要求用户自己安装解释器。最简单的解决方案是要求用户从Sun的网站(http://java.sun.com/getjava/)下载并安装Java运行时环境。

无论如何处理解释器的需求,应用程序的分发方式与其他程序类似,可以通过CD、网站或其他方式提供。用户需要运行安装程序(如果有的话)来设置应用程序,或者手动复制文件和文件夹。

小程序更容易提供,因为它们可以由Web浏览器(如Microsoft Internet Explorer、Netscape Navigator和Mozilla)运行。但是,如果程序是Java 2小程序,用户必须运行配备Java插件的浏览器,该插件也可以从Sun作为Java运行时环境的一部分下载。

然而,提供小程序而不是应用程序存在一些缺点,例如小程序的默认安全策略使得它们无法在用户的计算机上读写数据等。

5.2 Java Web Start的工作原理

Java Web Start需要Java运行时环境,它提供了一种像小程序一样安装和运行应用程序的方式。其工作流程如下:

graph LR
    A[程序员将应用程序打包成JAR文件,并包含使用Java网络启动协议(JNLP)的文件] --> B[将文件发布到Web服务器,并创建一个链接到该文件的网页]
    B --> C[用户使用浏览器加载页面并点击链接]
    C --> D{用户是否有Java运行时环境?}
    D -- 否 --> E[打开对话框询问是否下载并安装,安装后运行程序,程序保存到缓存中]
    D -- 是 --> F[直接运行程序,程序保存到缓存中]

具体步骤如下:
1. 程序员将应用程序打包成JAR文件,并包含一个使用Java网络启动协议(JNLP)的文件,该协议是Java Web Start的一部分。
2. 将该文件与一个链接到该文件的网页一起发布到Web服务器上。
3. 用户使用浏览器加载页面并点击链接。
4. 如果用户没有Java运行时环境,会打开一个对话框询问是否下载并安装。目前完整安装大小为5.7MB,在56k的互联网连接上可能需要30 - 45分钟下载。
5. Java运行时环境安装并运行程序,打开新的框架和其他界面组件,就像运行任何其他应用程序一样。程序会保存到缓存中,因此以后再次运行时无需再次安装。

要查看Java Web Start的实际运行效果,可以访问Sun的Java Web Start网站(http://java.sun.com/products/javawebstart)并点击Demos链接。Web Start Demos页面包含几个Java应用程序的图片,每个应用程序都有一个启动按钮,点击该按钮即可运行应用程序。

与小程序不同,使用Java Web Start启动的应用程序在自己的窗口中运行,就像从命令行运行一样。而且,Java Web Start应用程序为用户提供了安全保障。当应用程序尝试进行某些操作(如读写文件)时,Java Web Start可以询问用户是否允许。如果用户不允许,应用程序将无法完全正常运行。

一旦Java Web Start运行了一个应用程序,它会将其存储在缓存中,以便以后再次运行时无需安装。唯一的例外是当应用程序的新版本可用时,新版本将自动下载并替换现有版本。虽然第一次使用Web浏览器运行Java Web Start应用程序,但以后运行时不一定需要使用浏览器。例如,多次运行某个演示程序(如点策略游戏)时,会出现一个对话框询问是否要创建无需浏览器即可运行的快捷方式。

Java动画编程与Java Web Start新特性

6. Java Web Start的安全机制

Java Web Start为用户提供了额外的安全保障,这是它与传统应用程序和小程序在安全方面的重要区别。当应用程序尝试执行一些敏感操作时,Java Web Start会触发安全对话框,询问用户是否允许这些操作。这些敏感操作通常包括读写文件、加载网络资源等,而这些操作在小程序的默认安全策略下是不被允许的。

例如,有一个文本编辑器的演示程序。当用户第一次尝试使用这个应用程序保存文件时,会弹出一个安全咨询对话框。用户可以在这个对话框中选择是否允许应用程序进行文件保存操作。如果用户不允许,那么应用程序将无法正常保存文件,其功能会受到限制。

这种安全机制可以有效地保护用户的计算机安全,防止未经授权的应用程序对用户数据进行读写操作。同时,它也给予了用户一定的控制权,让用户可以根据自己的需求和信任程度来决定是否允许应用程序执行敏感操作。

7. Java Web Start的缓存机制

Java Web Start的缓存机制是其提高应用程序运行效率的一个重要特性。当用户第一次通过Java Web Start运行一个应用程序时,应用程序会被下载并安装到本地的缓存中。以后再次运行这个应用程序时,系统会首先检查缓存中是否已经存在该应用程序,如果存在且没有新版本可用,就会直接从缓存中加载应用程序,而无需再次进行下载和安装,从而大大节省了时间和网络资源。

只有当应用程序有新版本发布时,Java Web Start才会自动下载并安装新版本,替换缓存中的旧版本。这个过程是自动完成的,用户无需手动干预,保证了用户始终使用的是最新版本的应用程序。

例如,用户多次运行点策略游戏时,系统会将游戏文件缓存起来。下次运行时,如果游戏没有更新,就可以快速启动。这种缓存机制不仅提高了应用程序的运行效率,还为用户提供了更好的使用体验。

8. Java动画编程与Java Web Start的综合应用展望

Java动画编程和Java Web Start这两个技术领域虽然各有特点,但它们在实际应用中可以相互结合,创造出更丰富、更强大的应用程序。

在动画编程方面,Java提供了强大的图形处理能力和灵活的动画控制机制,可以实现各种复杂的动画效果。而Java Web Start则为这些动画应用程序的分发和运行提供了便捷的方式。通过Java Web Start,用户可以直接在网页上点击链接,快速下载并运行包含动画效果的Java应用程序,无需进行繁琐的安装过程。

例如,可以开发一个基于Java的动画游戏,利用Java动画编程技术实现精美的游戏画面和流畅的动画效果。然后使用Java Web Start将这个游戏打包发布到网络上,用户只需点击网页上的链接,就可以在自己的计算机上运行这个游戏。同时,Java Web Start的安全机制可以确保游戏在运行过程中不会对用户的计算机造成安全威胁,缓存机制可以提高游戏的启动速度和运行效率。

未来,随着Java技术的不断发展和应用场景的不断拓展,Java动画编程和Java Web Start的综合应用将会越来越广泛。它们将在游戏开发、教育、娱乐等领域发挥重要作用,为用户带来更加丰富和精彩的体验。

9. 总结

本文详细介绍了Java动画编程和Java Web Start的相关知识。在Java动画编程方面,我们学习了如何存储和显示一组相关图像,以及如何实现网球在屏幕上弹跳的动画效果。通过 Animate 小程序和 BouncePanel 类的示例,我们了解了Java动画编程的基本原理和实现步骤。同时,还解答了一些常见的动画编程问题,如线程化动画程序的暂停机制和图像绘制坐标的问题。

在Java Web Start方面,我们了解了它的工作原理、安全机制和缓存机制。Java Web Start为Java应用程序的分发和运行提供了一种全新的方式,它可以让用户通过网页链接快速下载和运行应用程序,同时提供了安全保障和高效的缓存机制。

通过对这些知识的学习,我们可以更好地利用Java技术开发出具有丰富动画效果的应用程序,并通过Java Web Start将这些应用程序方便地分发给用户。希望本文的内容对大家在Java编程和应用开发方面有所帮助。

10. 学习资源推荐

如果你想进一步深入学习Java动画编程和Java Web Start,可以参考以下资源:
- 在线教程 :有许多网站提供了丰富的Java编程教程,如W3Schools、JavaTpoint等。这些教程通常包含详细的代码示例和解释,适合初学者和有一定基础的开发者。
- 开源项目 :在GitHub等开源代码托管平台上,可以找到许多优秀的Java动画和Java Web Start相关的开源项目。通过学习这些项目的代码,可以了解到实际应用中的最佳实践和技巧。
- 书籍 :有一些经典的Java编程书籍,如《Effective Java》《Java核心技术》等,这些书籍对Java的各个方面都有深入的讲解,可以帮助你系统地学习Java知识。

通过不断学习和实践,相信你可以在Java编程领域取得更大的进步。

资源类型 具体资源 特点
在线教程 W3Schools、JavaTpoint 包含详细代码示例和解释,适合不同水平开发者
开源项目 GitHub上相关项目 可学习实际应用中的最佳实践和技巧
书籍 《Effective Java》《Java核心技术》 系统讲解Java知识,适合深入学习
graph LR
    A[Java动画编程学习] --> B[在线教程学习]
    A --> C[开源项目研究]
    A --> D[书籍阅读]
    E[Java Web Start学习] --> B
    E --> C
    E --> D

总之,Java动画编程和Java Web Start都是非常有价值的技术,它们为Java开发者提供了更多的可能性和机会。希望大家能够充分利用这些技术,开发出优秀的Java应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值