65.9K
CodeProject 正在变化。 阅读更多。
Home

如何编写 Applet 代码

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2009年3月19日

CPOL

7分钟阅读

viewsIcon

77360

一篇帮助编写Applet代码的文章。

160px-Java_logo_svg.png

引言

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”前缀:JAppletJFrameJPanel等。为了简化起见,本文中的一些Applet代码将使用java.awt包中定义的旧Applet类。

出现在电脑屏幕上的所有东西都必须被写上去。许多编程语言使用标准输出函数,例如printf(打印格式)、Console.WriteLineSystem.out.println等。这些函数和方法确保出现在输出设备(屏幕、打印机)上的任何内容都被格式化为人类可读的。然而,系统函数是写入屏幕的。电脑屏幕是由称为像素的小方格组成的网格。每个像素的颜色都可以单独设置,在屏幕上绘图只是意味着设置单个像素的颜色。图形上下文在由像素组成的矩形中绘图。矩形中的位置由一对整数坐标(x, y)指定。左上角的坐标是(0, 0)。x坐标从左到右增加,y坐标从上到下增加。

gui_coordinates.png

要编写一个绘制图形的Applet,你需要知道有哪些可用的绘图子例程。在Java中,内置的绘图子例程可以在Graphics类的对象中找到,Graphicsjava.awt包中的一个类。在Applet的paint()例程中,你可以使用Graphics对象g进行绘图。当系统调用paint()方法时,这个对象作为参数提供给paint()例程。除其他之外,Graphics对象的三个子例程是:

  • g.setColor(c)用于设置绘图时使用的颜色。参数c是属于Color类的对象:“g.setColor(Color.RED)”。
  • g.drawRect(x, y, w, h)绘制矩形的轮廓。参数xywh必须是整数值表达式。此子例程绘制一个矩形的轮廓,其左上角距离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)绘制,其中xy是方格左上角的坐标。这是棘手的部分。我们不能仅仅绘制一个具有上述尺寸的矩形并用一种颜色填充它。因此,在绘制方格之前,我们必须确定它应该是红色还是黑色。也就是说,我们必须用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%2col%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);
         } 
      } 
   } 
}

checkerboard.gif

1.JPG

基本概念

上述Applet涉及绘制一个矩形,其中方格的颜色基于这样一个条件:如果行和列的方格都为奇数或都为偶数,则颜色为红色;否则为黑色。为了用方格填充矩形,一个for循环迭代8个元素形成8行,迭代8个元素形成8列。正如我们所知,if语句在条件为布尔真时执行一段代码块。如果不是(else),则执行相反类型的代码。因此,理解Applet代码不仅涉及颜色、图形和坐标,还涉及控制流结构和子例程。考虑这个Applet:

rect.JPG

这个 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 时

  1. 绘制一个矩形(使用 g.drawRect 子例程)。
  2. 增加内嵌。
  3. 减少宽度和高度。

这是组合在一起的 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 撰写。
© . All rights reserved.