如何编写 Applet 代码





0/5 (0投票)
一篇帮助编写Applet代码的文章。
引言
Applet是一个在网页上运行的Java程序。Applet不是一个独立的应用程序,它没有main()
例程。实际上,Applet是一个对象而不是一个类。在Java语言中,类表示一种数据类型。每个类都定义了一种新的数据类型。例如,你可以定义一个名为Point
的类来表示二维X和Y坐标系中的一个数据点。这个类可以定义字段(每个都是double
类型)来保存点的X和Y坐标,以及操作点的方法。Point
类是一种新的数据类型。在讨论数据类型时,区分数据类型本身和数据类型所表示的值是很重要的。char
是一种数据类型:它表示Unicode字符。但是,一个char值表示一个单一的特定字符。类是一种数据类型;类的值称为对象。但是,当使用Sun的J2EE SDK(包含JDK)附带的javac.exe编译器编译Applet代码时,会生成一个类文件。该文件与源代码中定义的类同名,并在HTML文档主体中的Applet标签内被引用。例如,如果你的Applet名为myApplet.java,那么在使用javac.exe编译器后,你将得到一个myApplet.class文件。该文件在嵌入Applet标签时必须用引号括起来。一个需要记住的重要点是,Swing API和Java 2D API在任何组件之前都使用“J”前缀:JApplet
、JFrame
、JPanel
等。为了简化起见,本文中的一些Applet代码将使用java.awt包中定义的旧Applet
类。
出现在电脑屏幕上的所有东西都必须被写上去。许多编程语言使用标准输出函数,例如printf
(打印格式)、Console.WriteLine
、System.out.println
等。这些函数和方法确保出现在输出设备(屏幕、打印机)上的任何内容都被格式化为人类可读的。然而,系统函数是写入屏幕的。电脑屏幕是由称为像素的小方格组成的网格。每个像素的颜色都可以单独设置,在屏幕上绘图只是意味着设置单个像素的颜色。图形上下文在由像素组成的矩形中绘图。矩形中的位置由一对整数坐标(x, y)指定。左上角的坐标是(0, 0)。x坐标从左到右增加,y坐标从上到下增加。
要编写一个绘制图形的Applet,你需要知道有哪些可用的绘图子例程。在Java中,内置的绘图子例程可以在Graphics
类的对象中找到,Graphics
是java.awt包中的一个类。在Applet的paint()
例程中,你可以使用Graphics
对象g
进行绘图。当系统调用paint()
方法时,这个对象作为参数提供给paint()
例程。除其他之外,Graphics
对象的三个子例程是:
g.setColor(c)
用于设置绘图时使用的颜色。参数c
是属于Color
类的对象:“g.setColor(Color.RED)
”。g.drawRect(x, y, w, h)
绘制矩形的轮廓。参数x
、y
、w
、h
必须是整数值表达式。此子例程绘制一个矩形的轮廓,其左上角距离Applet左边缘x
像素。矩形的宽度为w
像素,高度为h
像素。g.fillRect(x, y, w, h)
与drawRect
类似,不同之处在于它填充矩形的内部而不是只绘制轮廓。
假设我们要编写一个绘制棋盘的Applet。假设Applet的大小是160x160像素。棋盘中的每个方格是20x20像素。棋盘包含8行8列。方格是红色和黑色。如果行号和列号都是偶数或都是奇数,则颜色为红色。否则,为黑色。每个方格都是一个高20像素、宽20像素的矩形,因此可以用命令g.fillRect(x, y, 20, 20)
绘制,其中x
和y
是方格左上角的坐标。这是棘手的部分。我们不能仅仅绘制一个具有上述尺寸的矩形并用一种颜色填充它。因此,在绘制方格之前,我们必须确定它应该是红色还是黑色。也就是说,我们必须用g.setColor
来校正颜色。左上角的坐标是(0, 0)。由于每个方格高20像素,第二行的顶部是y=20。想象一下,高度是图表上的垂直Y轴。第三行是40像素,接着是60、80、100、120和140。如果我们假设行编号为0、1、2、3...7,那么顶部由y = row*20给出,其中row是行号。类似地,列col
中方格的左边缘由col*20
给出(当列编号为0、1、2、3...7时)。有8行8列,并使用数字0、1、2、3、4、5、6、7表示这些行和列,可以安全地使用for
循环,这是一种遍历每个元素的控制结构:“for (row = 0; row < 8; row++)
”。类似地,0-7表示8列:“for (col = 0; col < 8; col++)
”。
现在,我们必须确定该行中的方格是否为红色。回想一下,如果行和列都是偶数或都是奇数,则方格为红色。在 Java 中,模运算符 %
是确定奇偶数最方便的方法。也就是说,如果 N%2
为 0,则整数 N
为偶数,测试可以表示为:
if ((row%2 == 0 && col%2 == 0) || (row%2 == 1 && col%2 == 1))
&&
运算符是逻辑 AND,||
运算符是逻辑 OR。逻辑 OR 运算符 (||
) 在其中一个或两个操作数为 true 时返回布尔值 true,否则返回 false。因此,上述内容本质上与询问 row%2
和 col%2
是否具有相同的值相同。这个测试可以更简单地表示为:
"if (row%2 == col%2)"
完整代码
import java.awt.*;
import java.applet.*;
public class Checkerboard extends Applet {
public void paint(Graphics g) {
int row; // Row number, from 0 to 7
int col; // Column number, from 0 to 7
int x,y; // Top-left corner of square
for ( row = 0; row < 8; row++ ) {
for ( col = 0; col < 8; col++) {
x = col * 20;
y = row * 20;
if ( (row % 2) == (col % 2) )
g.setColor(Color.red);
else
g.setColor(Color.black);
g.fillRect(x, y, 20, 20);
}
}
}
}
基本概念
上述Applet涉及绘制一个矩形,其中方格的颜色基于这样一个条件:如果行和列的方格都为奇数或都为偶数,则颜色为红色;否则为黑色。为了用方格填充矩形,一个for
循环迭代8个元素形成8行,迭代8个元素形成8列。正如我们所知,if
语句在条件为布尔真时执行一段代码块。如果不是(else),则执行相反类型的代码。因此,理解Applet代码不仅涉及颜色、图形和坐标,还涉及控制流结构和子例程。考虑这个Applet:
这个 Applet 首先用青色填充其矩形区域。然后,它将绘图颜色更改为黑色,并绘制一系列矩形,每个矩形都嵌套在前一个矩形中。这些矩形可以使用 while
循环绘制。while
语句重复一组 Java 语句多次。它会在条件为布尔真时重复这组语句。
public void paintComponent(Graphics g) {
super.paintComponent(g);
int count = 0;
while (count < 50) {
g.drawLine(20, count*5, 80, count*5);
count = count + 1;
}
g.drawString("Loop is finished. count="+count, 10, 300);
}
这会重复调用 drawLine()
50 次。第一次测试 while
条件时,它被发现具有布尔真值,因为 count
的值为 0,小于 50。每次循环时,矩形都会变小,并且会向下和向右移动一点。我们需要变量来记录矩形左上角从 Applet 边缘的内嵌距离。while
循环在矩形缩小到没有时结束。总的来说,绘制此 Applet 的算法是:
- 将绘图颜色设置为青色。
- 填充整个 Applet(使用
g.fillRect
子例程)。 - 将绘图颜色设置为黑色。
- 将左上角内嵌设置为 0。
- 将矩形宽度和高度设置为与 Applet 一样大。
当宽度和高度大于 0 时
- 绘制一个矩形(使用
g.drawRect
子例程)。 - 增加内嵌。
- 减少宽度和高度。
这是组合在一起的 Applet 代码:
import java.awt.*;
import java.applet.Applet;
public class Rectangle extends Applet {
public void paint(Graphics g) {
// Draw a set of nested black rectangles on a red background.
// Each nested rectangle is separated by 15 pixels on
// all sides from the rectangle that encloses it.
int inset; // Gap between borders of applet
// and one of the rectangles.
int rectWidth, rectHeight; // The size of one of the rectangles.
g.setColor(Color.cyan);
g.fillRect(0,0,300,160); // Fill the entire applet with red.
g.setColor(Color.black); // Draw the rectangles in black.
inset = 0;
rectWidth = 299; // Set size of first rect to size of applet.
rectHeight = 159;
while (rectWidth >= 0 && rectHeight >= 0) {
g.drawRect(inset, inset, rectWidth, rectHeight);
inset += 15; // Rects are 15 pixels apart.
rectWidth -= 30; // Width decreases by 15 pixels
// on left and 15 on right.
rectHeight -= 30; // Height decreases by 15 pixels
// on top and 15 on bottom.
}
} // end paint()
}
建议阅读
- 材料由 Fred Schwarts 撰写。