Applet HTML Tags and Attributes
In its most basic form, an example for using the applet tag looks like this:
<applet code="NotHelloWorldApplet.class" >
As you have seen, the code attribute gives the name of the class file and must include the .class extension; the width and height attributes size the window that will hold the applet. Both are measured in pixels. You also need a matching </applet> tag that marks the end of the HTML tagging needed for an applet. The text between the <applet> and </applet> tags is displayed only if the browser cannot show applets. These tags are required. If any are missing, the browser cannot load your applet. All of this information would usually be embedded in an HTML page that, at the very least, might look like this:
<html> <head> <title>NotHelloWorldApplet</title> </head> <body> The next line of text is displayed under the auspices of Java: <applet code="NotHelloWorldApplet.class" > If your browser could show Java, you would see an applet here. </applet> </body> </html>
According to the HTML specification, the HTML tags and attributes such as applet can be in upper- or lowercase. We use lowercase because that is the recommendation of the newer XHTML specification. However, the name of the applet class is case-sensitive! The letter case may be significant in other attributes, such as names of JAR files, if the web server file system is case sensitive.
Applet Attributes for Positioning
What follows are short discussions of the various attributes that you can (or must) use within the applet tag to position your applet. For those familiar with HTML, many of these attributes are similar to those used with the IMG tag for image placement on a web page.
- width, height
These attributes are required and give the width and height of the applet, measured in pixels. In the applet viewer, this is the initial size of the applet. You can resize any window that the applet viewer creates. In a browser, you cannot resize the applet. You will need to make a good guess about how much space your applet requires to show up well for all users.
- align
This attribute specifies the alignment of the applet. There are two basic choices. The applet can be a block with text flowing around it, or the applet can be inline, floating inside a line of text as if it were an oversized text character. The first two values (left and right) make the text flow around the applet. The others make the applet flow with the text.
The choices are described in Table 10-1.
Table 10-1. Applet positioning attributes
Attribute |
What It Does |
---|---|
left | Places the applet at the left margin of the page. Text that follows on the page goes in the space to the right of the applet. |
right | Places the applet at the right margin of the page. Text that follows on the page goes in the space to the left of the applet. |
bottom | Places the bottom of the applet at the bottom of the text in the current line. |
top | Places the top of the applet with the top of the current line. |
texttop | Places the top of the applet with the top of the text in the current line. |
middle | Places the middle of the applet with the baseline of the current line. |
absmiddle | Places the middle of the applet with the middle of the current line. |
baseline | Places the bottom of the applet with the baseline of the current line. |
absbottom | Places the bottom of the applet with the bottom of the current line. |
vspace, hspace | These optional attributes specify the number of pixels above and below the applet (vspace) and on each side of the applet (hspace).Screenshot-6 shows all alignment options for an applet that floats with the surrounding text. The vertical bar at the beginning of each line is an image. Since the image is taller than the text, you can see the difference between alignment with the top or bottom of the line and the top or bottom of the text.
Applet alignment
Applet Attributes for CodeThe following applet attributes tell the browser how to locate the applet code; here are short descriptions.
![]() JavaScript is a scripting language that can be used inside web pages, invented by Netscape and originally called LiveScript. It has little to do with Java, except for some similarity in syntax. It was a marketing move to call it JavaScript. A subset (with the catchy name of ECMAScript) is standardized as ECMA-262. But, to nobody's surprise, Netscape and Microsoft support incompatible extensions of that standard in their browsers. For more information on JavaScript, we recommend the tutorial JavaScript: The Definitive Guide by David Flanagan, shared by Oracle.To access an applet from JavaScript, you first have to give it a name. <applet code="CalculatorApplet.class" </applet> You can then refer to the object as document.applets.appletname. For example, var calcApplet = document.applets.calc; Through the magic of the integration between Java and JavaScript that both Netscape and Internet Explorer provide, you can call applet methods: calcApplet.clear(); (Our calculator applet doesn't have a clear method; we just want to show you the syntax.) In http://www.javaworld.com/javatips/jw-javatip80.html, Francis Lu uses JavaScript-to-Java communication to solve an age-old problem: to resize an applet so that it isn't bound by hardcoded width and height attributes. This is a good example of the integration between Java and JavaScript. It also shows how messy it is to write JavaScript that works on multiple browsers.The name attribute is also essential when you want two applets on the same page to communicate with each other directly. You specify a name for each current applet instance. You pass this string to the getApplet method of the AppletContext class. We will discuss this mechanism, called inter-applet communication, later in this chapter. Applet Attributes for Java-Challenged ViewersIf a web page containing an applet tag is viewed by a browser that is not aware of Java applets, then the browser ignores the unknown applet and param tags. All text between the <applet> and </applet> tags is displayed by the browser. Conversely, Java-aware browsers do not display any text between the <applet> and </applet> tags. You can display messages inside these tags for those poor folks that use a prehistoric browser. For example, <applet code="CalculatorApplet.class" > If your browser could show Java, you would see a calculator here. </applet> Of course, nowadays most browsers know about Java, but Java may be deactivated, perhaps by the user or by a paranoid system administrator. You can then use the alt attribute to display a message to these unfortunate souls. <applet code="CalculatorApplet.class" alt="Java If your browser could show Java, you would see a calculator here"> The object TagThe object tag is part of the HTML 4.0 standard, and the W3 consortium suggests that people use it instead of the applet tag. There are 35 different attributes to the object tag, most of which (such as onkeydown) are relevant only to people writing Dynamic HTML. The various positioning attributes such as align and height work exactly as they did for the applet tag. The key attribute in the object tag for your Java applets is the classid attribute. This attribute specifies the location of the object. Of course, object tags can load different kinds of objects, such as Java applets or ActiveX components like the Java Plug-In itself. In the code attribute, you specify the nature of the object. For example, Java applets have a code type of app/java. Here is an objecct tag to load a Java applet: <object codetype="app/java" classid="java:CalculatorApplet.class" > Note that the classid attribute can be followed by a codebase attribute that works exactly as it did with the applet tag. Passing Information to AppletsJust as apps can use command-line information, applets can use parameters that are embedded in the HTML file. This is done via the HTML tag called param along with attributes that you define. For example, suppose you want to let the web page determine the style of the font to use in your applet. You could use the following HTML tags: <applet code="FontParamApplet.class" > <param value="Helvetica"/> </applet> You then pick up the value of the parameter, using the getParameter method of the Applet class, as in the following example: public class FontParamApplet extends JApplet { public void init() { String fontName = getParameter("font"); . . . } . . . }
You can call the getParameter method only in the init method of the applet, not in the constructor. When the applet constructor is executed, the parameters are not yet prepared. Since the layout of most nontrivial applets is determined by parameters, we recommend that you don't supply constructors to applets. Simply place all initialization code into the init method.Parameters are always returned as strings. You need to convert the string to a numeric type if that is what is called for. You do this in the standard way by using the appropriate method, such as parseInt of the Integer class. For example, if we wanted to add a size parameter for the font, then the HTML code might look like this: <applet code="FontParamApplet.class" > <param value="Helvetica"/> <param value="24"/> </applet> The following source code shows how to read the integer parameter. public class FontParamApplet extends JApplet { public void init() { String fontName = getParameter("font"); int fontSize = Integer.parseInt(getParameter("size")); . . . } }
The strings used when you define the parameters via the param tag and those used in the getParameter method must match exactly. In particular, both are case sensitive.In addition to ensuring that the parameters match in your code, you should find out whether or not the size parameter was left out. You do this with a simple test for null. For example: int fontsize; String sizeString = getParameter("size"); if (sizeString == null) fontSize = 12; else fontSize = Integer.parseInt(sizeString); Here is a useful applet that uses parameters extensively. The applet draws a bar chart, shown in Screenshot-7. A chart applet
The applet takes the labels and the heights of the bars from the param values in the HTML file. Here is what the HTML file for Screenshot-7 looks like: <applet code="Chart.class" > <param value="Diameters of the Planets"/> <param value="9"/> <param name="name.1" value="Mercury"/> <param name="name.2" value="Venus"/> <param name="name.3" value="Earth"/> <param name="name.4" value="Mars"/> <param name="name.5" value="Jupiter"/> <param name="name.6" value="Saturn"/> <param name="name.7" value="Uranus"/> <param name="name.8" value="Neptune"/> <param name="name.9" value="Pluto"/> <param name="value.1" value="3100"/> <param name="value.2" value="7500"/> <param name="value.3" value="8000"/> <param name="value.4" value="4200"/> <param name="value.5" value="88000"/> <param name="value.6" value="71000"/> <param name="value.7" value="32000"/> <param name="value.8" value="30600"/> <param name="value.9" value="1430"/> </applet> You could have set up an array of strings and an array of numbers in the applet, but there are two advantages to using the param mechanism instead. You can have multiple copies of the same applet on your web page, showing different graphs: just put two applet tags with different sets of parameters on the page. And you can change the data that you want to chart. Admittedly, the diameters of the planets will stay the same for quite some time, but suppose your web page contains a chart of weekly sales data. It is easy to update the web page because it is plain text. Editing and recompiling a Java file on a weekly basis is more tedious. In fact, there are commercial Java beans that make much fancier graphs than the one in our chart applet. If you buy one, you can drop it into your web page and feed it parameters without ever needing to know how the applet renders the graphs. Example 10-5 is the source code of our chart applet. Note that the init method reads the parameters, and the paintComponent method draws the chart. Example Chart.java1. import java.awt.*; 2. import java.awt.font.*; 3. import java.awt.geom.*; 4. import javax.swing.*; 5. 6. public class Chart extends JApplet 7. { 8. public void init() 9. { 10. String v = getParameter("values"); 11. if (v == null) return; 12. int n = Integer.parseInt(v); 13. double[] values = new double[n]; 14. String[] names = new String[n]; 15. int i; 16. for (i = 0; i < n; i++) 17. { 18. values[i] = Double.parseDouble 19. (getParameter("value." + (i + 1))); 20. names[i] = getParameter("name." + (i + 1)); 21. } 22. 23. Container contentPane = getContentPane(); 24. contentPane.add(new ChartPanel(values, names, 25. getParameter("title"))); 26. } 27. } 28. 29. /** 30. A panel that draws a bar chart. 31. */ 32. class ChartPanel extends JPanel 33. { 34. /** 35. Constructs a ChartPanel. 36. @param v the array of values for the chart 37. @param n the array of names for the values 38. @param t the title of the chart 39. */ 40. public ChartPanel(double[] v, String[] n, String t) 41. { 42. names = n; 43. values = v; 44. title = t; 45. } 46. 47. public void paintComponent(Graphics g) 48. { 49. super.paintComponent(g); 50. Graphics2D g2 = (Graphics2D)g; 51. 52. // compute the minimum and maximum values 53. if (values == null) return; 54. double minValue = 0; 55. double maxValue = 0; 56. for (int i = 0; i < values.length; i++) 57. { 58. if (minValue > values[i]) minValue = values[i]; 59. if (maxValue < values[i]) maxValue = values[i]; 60. } 61. if (maxValue == minValue) return; 62. 63. int panelWidth = getWidth(); 64. int panelHeight = getHeight(); 65. 66. Font titleFont = new Font("SansSerif", Font.BOLD, 20); 67. Font labelFont = new Font("SansSerif", Font.PLAIN, 10); 68. 69. // compute the extent of the title 70. FontRenderContext context = g2.getFontRenderContext(); 71. Rectangle2D titleBounds 72. = titleFont.getStringBounds(title, context); 73. double titleWidth = titleBounds.getWidth(); 74. double top = titleBounds.getHeight(); 75. 76. // draw the title 77. double y = -titleBounds.getY(); // ascent 78. double x = (panelWidth - titleWidth) / 2; 79. g2.setFont(titleFont); 80. g2.drawString(title, (float)x, (float)y); 81. 82. // compute the extent of the bar labels 83. LineMetrics labelMetrics 84. = labelFont.getLineMetrics("", context); 85. double bottom = labelMetrics.getHeight(); 86. 87. y = panelHeight - labelMetrics.getDescent(); 88. g2.setFont(labelFont); 89. 90. // get the scale factor and width for the bars 91. double scale = (panelHeight - top - bottom) 92. / (maxValue - minValue); 93. int barWidth = panelWidth / values.length; 94. 95. // draw the bars 96. for (int i = 0; i < values.length; i++) 97. { 98. // get the coordinates of the bar rectangle 99. double x1 = i * barWidth + 1; 100. double y1 = top; 101. double height = values[i] * scale; 102. if (values[i] >= 0) 103. y1 += (maxValue - values[i]) * scale; 104. else 105. { 106. y1 += maxValue * scale; 107. height = -height; 108. } 109. 110. // fill the bar and draw the bar outline 111. Rectangle2D rect = new Rectangle2D.Double(x1, y1, 112. barWidth - 2, height); 113. g2.setPaint(Color.RED); 114. g2.fill(rect); 115. g2.setPaint(Color.BLACK); 116. g2.draw(rect); 117. 118. // draw the centered label below the bar 119. Rectangle2D labelBounds 120. = labelFont.getStringBounds(names[i], context); 121. 122. double labelWidth = labelBounds.getWidth(); 123. x = i * barWidth + (barWidth - labelWidth) / 2; 124. g2.drawString(names[i], (float)x, (float)y); 125. } 126. } 127. 128. private double[] values; 129. private String[] names; 130. private String title; 131. } java.applet.Applet 1.0![]()
|