Lecture 12

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 49

Java Overview

Java Overview
▪ Design goals & features
➢ platform independence, portable, secure, simple, object-oriented, …

▪ Programming models
➢ applications vs. applets vs. servlets
➢ intro to applets
− libraries, comments, classes, inheritance
− applet tag in HTML
− applet parameters
Java
Java was developed at Sun Microsystems, 1995
▪ originally designed for small, embedded systems in electronic appliances
▪ initial attempts used C++, but frustration at limitations/pitfalls

recall: C++ = C + OOP features


the desire for backward compatibility led to the retention of many bad features

desired features (from the Java white paper):


simple object-oriented robust
platform independent architecture neutral portable
dynamic interpreted high-performance
distributed multi-threaded secure

note: these are desirable features for any modern language


thus, Java has become very popular, especially when Internet related
also, Sun distributes free compilers (JDK) and open source
Language features

simple
▪ syntax is based on C++ (familiarity → easier transition for programmers)
▪ removed many confusing and/or rarely-used features
e.g., explicit pointers, operator overloading, automatic coercions
▪ added memory management (reference count/garbage collection hybrid)

object-oriented
▪ OOP facilities similar C++, all methods are dynamically bound
▪ pure OOP – everything is a class, no independent functions*

robust
▪ lack of pointers and memory management avoids many headaches/errors
▪ libraries of useful, tested classes increases level of abstraction
➢ arrays & strings are ADTs, well-defined interfaces
Language features (cont.)
platform independence
▪ want to be able to run Java code on multiple platforms
▪ neutrality is achieved by mixing compilation & interpretation
1. Java programs are translated into byte code by a Java compiler
➢ byte code is a generic machine code
2. byte code is then executed by an interpreter (Java Virtual Machine)
➢ must have a byte code interpreter for each hardware platform

▪ an Applet is a special form of Java application


➢ byte code is downloaded with page, JVM is embedded in browser

architecture-neutral
▪ no implementation dependent features
➢ e.g., sizes of primitive types is set (unlike C++)

portable
▪ byte code will run on any version of the Java Virtual Machine (JVM)
Language features (cont.)

dynamic
▪ JVM links classes at run-time as they are needed
▪ if supporting class is recompiled, don’t have to recompile entire project

interpreted
▪ needed for platform independence
▪ interpreted → faster code-test-debug cycle, better run-time error checking

high-performance
▪ faster than traditional interpretation since byte code is "close" to native code
▪ still somewhat slower than a compiled language (e.g., C++)
Language features (cont.)
distributed
▪ extensive libraries for coping with TCP/IP protocols like HTTP & FTP
▪ Java applications can access remote URL's the same as local files

multi-threaded
▪ a thread is like a separate program, executing concurrently
▪ can write Java programs that deal with many tasks at once by defining multiple
threads (same shared memory, but semi-independent execution)
▪ threads are important for multi-media, Web applications

secure
▪ Java applications do not have direct access to memory locations
➢ memory accesses are virtual, mapped by JVM to physical locations
➢ downloaded applets cannot open, read, or write local files
▪ JVM also verifies authenticity of classes as they are loaded
▪ Sun claim: execution model enables virus-free*, tamper-free* systems
Java programming models
Java applications are stand-alone programs
▪ must be compiled into Java byte code by Java compiler, then distributed
▪ executed by an interpreter (Java Virtual Machine)

Java applets provide for client-side programming


▪ compiled into Java byte code, then downloaded as part of a Web page
▪ executed by the JVM embedded within the Web browser

▪ unlike JavaScript, Java is full-featured with extensive library support


▪ Java and its APIs have become industry standards
➢ the language definition is controlled by Sun, ensures compatibility
➢ Applications Programming Interfaces standardize the behavior of useful classes
and libraries of routines

Java servlets provide similar capabilities on the server-side


▪ alternative to CGI programs, more fully integrated into Web server
Java applets

important point: Java applets & applications look different!


▪ if you want to define a stand-alone application, make an application
requires public static void main function, similar to C++ main
▪ if you want to embed the code in a Web page, make an applet
requires public void paint, public void init, …
▪ can define dual-purpose programs, but tricky

as with JavaScript, security is central


▪ when a Java applet is downloaded, the bytecode verifier of the JVM verifies to see if
it contains bytecodes that open, read, write to local disk
▪ a Java applet can open a new window but they have Java logo to prevent them from
being disguised as system window (for stealing password)
▪ a Java applet is not allowed to connect back to other servers except the host

▪ this secure execution environment is called sand box model


First Java applet
import java.awt.*;
import java.applet.*;

/**
* This class displays "Hello world!" on the applet window.
*/
public class HelloWorld extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello world!", 10, 10); // writes starting 10 pixels over & down
}
}

libraries
Java provides extensive library support in the form of classes
▪ libraries are loaded using import (similar to #include in C++)

java.awt: contains Abstract Window Toolkit (for GUI classes & routines)
java.applet: contains the applet class definition
First Java applet
import java.awt.*;
import java.applet.*;

/**
* This class displays "Hello world!" on the applet window.
*/
public class HelloWorld extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello world!", 10, 10); // writes starting 10 pixels over & down
}
}

comments in Java
// and /* . . . */ work the same as in C++
/** . . . */ designate documentation comments
▪ can be used to automatically generate HTML documentation (javadoc)
First Java applet
import java.awt.*;
import java.applet.*;

/**
* This class displays "Hello world!" on the applet window.
*/
public class HelloWorld extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello world!", 10, 10); // writes starting 10 pixels over & down
}
}

class definitions in Java


▪ similar to C++ (but no semi-colon at end)
can contain instance variables (data fields) & methods(member functions)
precede class & method definitions with public to make available to all programs
▪ there are no stand-alone functions in Java*
▪ must be stored in a file of same name with .java extension
e.g., HelloWorld.java
First Java applet
import java.awt.*;
import java.applet.*;

/**
* This class displays "Hello world!" on the applet window.
*/
public class HelloWorld extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello world!", 10, 10); // writes starting 10 pixels over & down
}
}

all applets inherit from the Applet class (in java.applet)


default methods include:
▪ init(): called when page is loaded to create/initialize variables
by default, does nothing
▪ paint(Graphics g): called to draw (after init) or redraw (after being obscured)
here, the paint method is overridden to display text on the applet window
Embedding an applet in HTML
to include an applet in a Web page, use either
▪ APPLET tag (deprecated)
CODE specifies applet name, HEIGHT and WIDTH specify window size
text between the APPLET tags is displayed if unable to execute (e.g., Java not enabled)

▪ OBJECT tag
preferred for HTML 4, but not universally supported

<html>
<!-- Hello1.html -->

<head>
<title>Hello World Page</title>
</head>

<body>

<p>
<applet code="HelloWorld.class" height=100 width=100>
You must use a Java-enabled browser to view this applet.
</applet>
</p>
view page in
</body> browser
</html>
HTML & applets
<html>
<!-- Hello2.html -->
an applet can be
<head>
<title>Hello World Page</title>
embedded within HTML
</head> elements just like any
<body> other element
<p>
<div align="center">
<table border=1>
<tr><td>
useful for formatting and
<applet code="HelloWorld.class" height=200 width=200>
You must use a Java-enabled browser to view this applet.
layout
</applet>

</td></tr>
</table>
</div>
</p>

</body>
</html>

view page in browser


Parameters in HTML
<html>
<!-- Hello3.html -->
can specify parameters
<head>
<title>Hello World Page</title> to the APPLET when it
</head>
is embedded in HTML
<body>

<p>
<div align="center"> • each parameter must
<table border=1> have its own PARAM tag
<tr><td>
inside the APPLET
<applet code="HelloWorld1.class" height=35 width=300> element
<param name="name" value="Chris">
<param name="age" value=20>
You must use a Java-enabled browser to view this applet.
</applet> • specifies parameter
</td></tr>
name and value
</table>
</div>
</p>

</body>
</html>

view page in browser


Applet parameters
import java.awt.*;
import java.applet.*;

/**
* This class displays a message based on parameters.
*/
public class HelloWorld1 extends Applet
{
public void paint(Graphics g)
{
String userName = getParameter("name");
int userAge = Integer.parseInt(getParameter("age"));

String message1 = "Hello " + userName + ".";


String message2 = "On your next birthday, you will be " +
(userAge+1) + " years old.";

g.drawString(message1, 10, 10);


g.drawString(message2, 10, 30);
}
}

can access parameters passed in from the HTML document


getParameter accesses the value of the parameter (must know its name)
▪ if the parameter represents a number, must parseInt or parseFloat
Java vs. C++
in Java, every variable & method belongs to a class
▪ as in C++, by default each object has its own copies of data fields
thus, known as instance variables
▪ as in C++, a variables declared static are shared by all class objects
thus, known as class variables
▪ similarly, can have a static method (class method)
can only operate on class variables, accessible from the class itself
class Math
{
public static final double PI = 3.14159; // access as Math.PI
public static double sqrt(double num) { . . . } // access as in Math.sqrt(9.0)
. . .
}
Primitive vs. reference types
primitive types are handled exactly as in C++
▪ space for a primitive object is implicitly allocated
→ variable refers to the actual data (stored on the stack)
reference types (classes) are handled differently
▪ space for a reference object must be explicitly allocated using new
→ variable refers to a pointer to the data (which is stored in the heap)
Note: unlike with C++, programmer is not responsible for deleting dynamic objects
JVM performs automatic garbage collection to reclaim unused memory

Java only provides by-value parameter passing


▪ but reference objects are implemented as pointers to dynamic memory
▪ resulting behavior mimics by-reference
public void Init(int[] nums)
{
for (int i = 0; i < nums.length; i++) {
nums[i] = 0;
}
}
_____________________________ _

int nums[] = new int[10];


Init(nums);
Java libraries
String class (automatically loaded from java.lang)
int length()
char charAt(index)
String str = "foo"
int indexOf(substring)
String substring(start, end) String str = new String("foo");
String toUpperCase()
boolean equals(Object)
...

Array class (automatically loaded from java.lang)


int length instance variable
Type [](index) operator
String toString() int[] nums = {1,2,3,4,5};
... int[] nums = new int[10];

Java provides extensive libraries of data structures & algorithms


java.util → Vector Stack LinkedList
Dictionary HashTable Random
Calendar
Java & inheritance
Java does NOT have templates*
▪ generic functions/classes are obtained via inheritance (e.g, Applet)
with inheritance, can derive a new class from an existing class
– automatically inherit attributes & methods of the parent class
– object of derived class can be used wherever parent object is expected

▪ every reference type is implicitly derived from the Object class

▪ by defining data structures that contain Objects, any reference type can be stored
(and even mixed)
Stack things = new Stack();

String str = "foobar";


things.push(str); // pushes String as an Object

Calendar today = Calendar.getDate();


things.push(today); // pushes Calendar as an Object

Calendar value1 = (Calendar)things.pop(); // pops & coerces


String value2 = (String)things.pop(); // pops & coerces
Hello again
import java.awt.*;
import java.applet.*;
import java.util.Random;

/**
* This class displays lots of "Hello world!"s on the applet window.
*/
public class HelloWorld1 extends Applet
{ Random class provides
private static final int NUM_WORDS=100;
private static Random randy; methods for generating
private int randomInRange(int low, int high) random values
{
return (Math.abs(randy.nextInt()) % (high-low+1)) + low;
}

public void init()


{
randy = new Random();
}

public void paint(Graphics g)


can override init method to
{
for (int i = 0; i < NUM_WORDS; i++) {
allocate & initialize (similar
int x = randomInRange(1, 200);
int y = randomInRange(1, 200);
to a constructor)
g.drawString("Hello world!", x, y);
}
}
}
<applet code="HelloWorld1.class" height=200 width=200>
You must use a Java-enabled browser to view this applet.
</applet>
Applet behavior
recall
▪ the init method is called when the applet is first loaded
useful for initializing variables & objects

▪ the paint method is called immediately after init, and whenever the applet needs to
be redrawn (e.g., after window resized or obscured)

when paint is called, it is given the default Graphics object


▪ Graphics methods include
void drawString(String msg, int x, int y)

void setColor(Color color)

Color class is predefined, constants include:


Color.red, Color.blue, Color.black, . . .
import java.awt.*;
import java.applet.*;
import java.util.Random; A colorful hello
/**
* This class displays lots of "Hello world!"s on the applet window.
*/
public class HelloWorld2 extends Applet
{
private static final int NUM_WORDS=100;
private static final Color[] colors =
{Color.black,Color.red,Color.blue,Color.green,Color.yellow};
private static Random randy;

private int RandomInRange(int low, int high)


{
return (Math.abs(randy.nextInt()) % (high-low+1)) + low;
} can store possible
public void init()
{
colors in an array
randy = new Random();
}

public void paint(Graphics g) change drawing color


{
for (int i = 0; i < NUM_WORDS; i++) {
int x = RandomInRange(1, 140);
using the setColor
int y = RandomInRange(10, 200);
g.setColor(colors[RandomInRange(0,4)]);
method
g.drawString("Hello world!", x, y);
}
}
}

<applet code="HelloWorld2.class" height=200 width=200> view page in


You must use a Java-enabled browser to view this applet.
</applet>
browser
Parameters & applet dimensions

recall:
▪ can specify parameters in the HTML document using <PARAM> tags
▪ access the parameter values (based on name) using getParameter method

can also access the dimensions of an applet using a Dimension object


Dimension dim = getSize(); // stores applet dimensions

can then access applet height via dim.height

can then access applet width via dim.width


import java.awt.*;
import java.applet.*;
import java.util.Random; Adaptive hello
/**
* This class displays lots of "Hello world!"s on the applet window.
*/
public class HelloWorld3 extends Applet
{
private static final Color[] colors =
{Color.black,Color.red,Color.blue,Color.green,Color.yellow};
getParameter
private static Random randy;
private Dimension dim;
accesses the values of
private int numReps; the parameters
private int RandomInRange(int low, int high)
{
return (Math.abs(randy.nextInt()) % (high-low+1)) + low;
} here, specify number of
public void init() reps in Web page
{
randy = new Random();
dim = getSize();
numReps = Integer.parseInt(getParameter("reps"));
}
uses getSize to
public void paint(Graphics g)
{ get dimensions, pick
for (int i = 0; i < numReps; i++) {
int x = RandomInRange(1, dim.width-65);
random coords for text
int y = RandomInRange(10, dim.height);
g.setColor(colors[RandomInRange(0,4)]);
within the applet
g.drawString("Hello world!", x, y);
}
} <applet code="HelloWorld3.class" height=300 width=400>
} <param name="reps" value=200>
view page in
You must use a Java-enabled browser to view this applet. browser
</applet>
Applet graphics
in addition to displaying text
▪ can also draw figures on a Graphics object

void drawLine(int x1, int y1, int x2, int y2)

void drawRect(int x, int y, int width, int height)


void fillRect(int x, int y, int width, int height)

void drawOval(int x, int y, int width, int height)


void fillOval(int x, int y, int width, int height)

EXAMPLE: draw a red circle inscribed in a square, then draw random dots
(dart pricks)
▪ by counting the number of dots inside vs. outside the circle, can estimate the value
of p

p = 4 * (area of circle/area of square)


public class Monte1 extends Applet

Graphical applet
{
private static Random randy;
private int NUM_POINTS;
private int SIZE;

private int RandomInRange(int low, int high) { CODE OMITTED }


private double distance(int x1, int y1, int x2, int y2) { CODE OMITTED }

public void init()


{ init method creates random
randy = new Random();
NUM_POINTS = Integer.parseInt(getParameter("points"));
number generator & gets
Dimension dim = getSize(); parameters
SIZE = Math.min(dim.width, dim.height);
}

public void paint(Graphics g) paint method draws a circle


{
g.setColor(Color.red); and a bunch of random points
g.fillOval(0, 0, SIZE, SIZE);
for (int i = 0; i < NUM_POINTS; i++) {
int x = RandomInRange(0, SIZE);
int y = RandomInRange(0, SIZE);
if (distance(x, y, SIZE/2, SIZE/2) < SIZE/2) {
g.setColor(Color.white);
}
else { <applet code="Monte1.class" height=300 width=300>
g.setColor(Color.black); <param name="points" value=20000>
} You must use a Java-enabled browser...
g.drawLine(x, y, x, y); </applet>
}
}
view page in browser
}
Double buffering

note: paint is called every time the page is brought to the front
▪ in current version of Monte, this means new dots are drawn each time the page is
obscured and then brought back to the front
→ wastes time redrawing
→ dots are different each time the applet is redrawn

the double buffering approach works by keeping an off-screen image


▪ in the init method (which is called when the page loads):
draw the figures on a separate, off-screen Graphics object
▪ in the paint method (which is called whenever the page is brought forward):
simply display the off-screen image on the screen
public class Monte2 extends Applet

Buffered applet
{
. . .
private Image offScreenImage;
private Graphics offScreenGraphics;
. . .
public void init()
{
init method is called when
randy = new Random(); page is loaded
NUM_POINTS = Integer.parseInt(getParameter("points"));
Dimension dim = getSize();
SIZE = Math.min(dim.width, dim.height);
does drawing to a separate,
offScreenImage = createImage(SIZE, SIZE);
offScreenGraphics = offScreenImage.getGraphics();
off-screen Graphics object
offScreenGraphics.setColor(Color.red);
offScreenGraphics.fillOval(0, 0, SIZE, SIZE);
for (int i = 0; i < NUM_POINTS; i++) {
paint is called after
init
int x = RandomInRange(0, SIZE); and whenever the applet is
int y = RandomInRange(0, SIZE);
if (distance(x, y, SIZE/2, SIZE/2) < SIZE/2) {
revisited
offScreenGraphics.setColor(Color.white);
}
else { Note: don’t see image in
offScreenGraphics.setColor(Color.black);
} progress
offScreenGraphics.drawLine(x, y, x, y);
} <applet code="Monte2.class" height=300 width=300>
} <param name="points" value=20000>
You must use a Java-enabled browser...
public void paint(Graphics g)
</applet>
{
g.drawImage(offScreenImage, 0, 0, null);
} view page in browser
}
public class Monte3 extends Applet
{
. . . Better buffering
public void init() {
randy = new Random();
NUM_POINTS = Integer.parseInt(getParameter("points"));
Dimension dim = getSize();
SIZE = Math.min(dim.width, dim.height);
if want to see image as it is
} drawn, must be done in
public void paint(Graphics g) { paint
if (offScreenImage == null) {
offScreenImage = createImage(SIZE, SIZE);
offScreenGraphics = offScreenImage.getGraphics();

offScreenGraphics.setColor(Color.red); when first loaded, have


g.setColor(Color.red);
offScreenGraphics.fillOval(0, 0, SIZE, SIZE);
paint draw on the graphics
g.fillOval(0, 0, SIZE, SIZE);
for (int i = 0; i < NUM_POINTS; i++) {
screen and also to an off-
int x = randomInRange(0, SIZE); screen buffer
int y = randomInRange(0, SIZE);
if (distance(x, y, SIZE/2, SIZE/2) < SIZE/2) {
offScreenGraphics.setColor(Color.white);

}
g.setColor(Color.white);
on subsequent repaints,
else {
offScreenGraphics.setColor(Color.black);
simply redraw the contents of
}
g.setColor(Color.black); the off-screen buffer
offScreenGraphics.drawLine(x, y, x, y);
g.drawLine(x, y, x, y);
}
}
else { <applet code="Monte3.class" height=300 width=300>
g.drawImage(offScreenImage, 0, 0, null); <param name="points" value=20000>
} </applet>
}
}
view page in browser
GUI elements in applets
Java has extensive library support for GUIs (Graphical User Interfaces)
▪ has elements corresponding to HTML buttons, text boxes, text areas, …

each element must be created and explicitly added to the applet


nameLabel = new Label("User's name");
add(nameLabel);

nameField = new TextField(20);


nameField.setValue("Dave Reed");
add(nameField);

by default, GUI elements are placed in the order they were added, with
elements moved to the next line as needed to fit
Text boxes
public class Monte4 extends Applet
{ public void paint(Graphics g)
. . . {
private Label insideLabel; . . .
private TextField insideField;
private Label outsideLabel; insideField.setText("0");
private TextField outsideField; outsideField.setText("0");
. . .
. . .
public void init()
{ if (distance(x, y, SIZE/2, SIZE/2) < SIZE/2) {
randy = new Random(); g.setColor(Color.white);
NUM_POINTS = int value =
Integer.parseInt(getParameter("points")); Integer.parseInt(insideField.getText())+1;
Dimension dim = getSize(); insideField.setText(""+value);
SIZE = Math.min(dim.width, dim.height); }
else {
insideLabel = new Label("Inside:"); g.setColor(Color.black);
add(insideLabel); int value =
insideField = new TextField(6); Integer.parseInt(outsideField.getText())+1;
add(insideField); outsideField.setText(""+value);
}
outsideLabel = new Label("Outside:");
add(outsideLabel); . . .
outsideField = new TextField(6); }
add(outsideField); } <applet code="Monte4.class" height=300 width=300>
} <param name="points" value=20000>
</applet>

view page in browser


GUI layout
public class Monte5 extends Applet
{
. . . Java provides several classes
public void init() for controlling layout
{
randy = new Random();
NUM_POINTS = Integer.parseInt(getParameter("points")); FlowLayout is default
Dimension dim = getSize();
SIZE = Math.min(dim.width, dim.height);

setLayout(new BorderLayout()); BorderLayout allows


Panel p = new Panel();
placement of elements around
insideLabel = new Label("Inside:"); the borders of the applet
p.add(insideLabel);
insideField = new TextField(5);
screen
p.add(insideField);
outsideLabel = new Label("Outside:");
p.add(outsideLabel); a Panel can contain
outsideField = new TextField(5);
p.add(outsideField); numerous elements
add(p, BorderLayout.SOUTH);
}
<applet code="Monte5.class" height=300 width=300>
<param name="points" value=20000>
. . .
</applet>
}
view page in browser
Event handling
in order to handle events (e.g., text changes, button clicks), can use the
event delegation model
▪ must specify that the class implements the ActionListener interface
public class Monte6 extends Applet implements ActionListener

▪ each source of events must be registered within the applet


dotButton = new Button("Click to generate dots");
dotButton.addActionListener();

▪ must have an actionPerformed method to handle events

public void actionPerformed(ActionEvent e)


{
if (e.getSource() == dotButton) {
drawDots();
}
}
ActionListener
import java.awt.*; public void drawCircle()
import java.applet.*; {
import java.awt.event.*; CODE FOR DRAWING CIRCLE
import java.util.Random; }

public class Monte6 extends Applet public void drawDots()


implements ActionListener {
{ drawCircle();
. . .
private Button dotButton; Graphics g = getGraphics();
for (int i = 0; i < NUM_POINTS; i++) {
public void init() CODE FOR DRAWING DOTS
{ }
randy = new Random(); }
NUM_POINTS =
Integer.parseInt(getParameter("points")); public void paint(Graphics g)
Dimension dim = getSize(); {
SIZE = dim.width; g.drawImage(offScreenImage, 0, 0, null);
}
setLayout(new BorderLayout());
dotButton = public void actionPerformed(ActionEvent e)
new Button("Click to generate dots"); {
dotButton.addActionListener(this); if (e.getSource() == dotButton) {
add(dotButton, BorderLayout.SOUTH); drawDots();
}
drawCircle(); }
} }

<applet code="Monte6.class" height=300 width=300>


<param name="points" value=20000> view page in browser
</applet>
Applet examples

The Java Boutique has lots of sample applets with source code

▪ Graphing Calculator

▪ Mandlebrot Set

▪ Email front-end

▪ Web search front-end

▪ Java Tetris
Combining Java & JavaScript

▪ integrating Java with JavaScript


➢ calling Java routines from JavaScript
➢ controlling an applet from JavaScript
➢ accessing JavaScript & HTML elements from an applet

▪ related topics
➢ JavaBeans, Java archives (JARs)
JavaScript vs. Java
recall: JavaScript is very good for simple tasks, GUI layout
▪ flexible data typing, primitive object types fine for quick development
▪ integration with HTML makes layout & control of GUI elements easy

▪ not much library support, only primitive data structuring capabilities


▪ not well-suited to multi-file projects, OO approach

recall: Java is better at complex tasks, especially graphics


▪ full-featured, more robust, extensive libraries of classes/routines
▪ can support large projects, interacting objects

▪ GUI layout is difficult, integration with HTML not obvious

IDEAL: make use of the the strengths of each language


▪ include applets in a page when needed (e.g., graphics)
▪ allow communication between applet & JavaScript code
Calling Java routines from JavaScript
Netscape Communicator allows direct calls to Java routines
▪ specify full package name of routine, then call as in Java
useful for more esoteric routines that are not supported directly in JavaScript
▪ this feature is NOT supported by Internet Explorer

<html>
<!-- Note: works in Netscape only. -->

<head>
<title>Java+JavaScript Demo</title>
</head>

<body>
<script language="JavaScript">
document.write(java.lang.Math.random());
</script>
</body>
</html>
Calling applet methods
more commonly, want to include an applet in a page,
control via HTML events & JavaScript

▪ want to draw dots inside a square (with an inscribed circle)


▪ could build GUI interface into applet, but required tricky layout manager
▪ instead, leave graphics up to the applet, controlled via JavaScript

to call a Java applet method from JavaScript

document.appletName.methodCall(…)
import java.awt.*;
import java.applet.*;
import java.util.Random; MontePI revisited
public class Monte7 extends Applet
{ init creates the
private static Random randy;
private int SIZE;
private Image offScreenImage;
random number
private Graphics offScreenGraphics;
generator & gets
private int randomInRange(int low, int high) {…}
private double distance(int x1, int y1, int x2, int y2) {…} applet size
public void init()
{
randy = new Random();
Dimension dim = getSize();
SIZE = dim.width;
drawDots draws
}
drawCircle();
the dots on the
public void drawCircle() { screen and to the
// DRAWS CIRCLE ON BOTH getGraphics() AND
// offScreenGraphics off-screen buffer
}

public void drawDots(int numPoints)


{
paint redraws the
// DRAWS numPoints RANDOM DOTS ON BOTH getGraphics()
// AND offScreenGraphics
}

public void paint(Graphics g)


screen using the
{
g.drawImage(offScreenImage, 0, 0, null);
buffer
}
}
MontePI example (cont.)
<html>
<!-- Monte7.html -->
here, HTML button
<head>
<title>Monte Carlo Darts Page</title>
</head>
controls the applet
<body bgcolor="gray">
(via JavaScript)
<div style="text-align:center">
<applet code="Monte7.class" name="MonteApplet"
height=300 width=300>
You must use a Java-enabled browser to view this applet.
</applet>

<br /><br />

<form name="MonteForm">
<input type="button" value="Generate points"
onClick="document.MonteApplet.drawDots(1000);">
</form>
</div>
</body>
</html>

view page in browser


Example (cont.)
better interface:
<html>
<!-- Monte7a.html --> allow user to specify
<head>
<title>Monte Carlo Darts Page</title> number of dots in text
</head>
box
<body bgcolor="gray">
<div style="text-align:center">
<applet code="Monte7.class" name="MonteApplet"
height=300 width=300>
You must use a Java-enabled browser to view this applet.
each click adds new
</applet> dots, have separate
<br /><br />
button to clear
<form name="MonteForm">
<input type="button" value="Generate"
onClick="numDots = parseFloat(document.MonteForm.numPoints.value);
document.MonteApplet.drawDots(numDots);">
<input type="text" name="numPoints" size=6 value=100> points
<br /><br />
<input type="button" value="Clear the screen"
onClick="document.MonteApplet.drawCircle();">
</form>
</div>
</body>
</html>

view page in browser


Dividing control
where the control lies affects the efficiency/usability of an applet
▪ want the applet to be as self-contained as possible,
take advantage of speed advantage, more advanced features
▪ but if GUI controls are in HTML, then JavaScript needs overall control

consider adding counters for number of dots inside & outside circle
▪ have the applet keep track of the dots in instance variables

1. after drawing all dots, JavaScript could access counts & display
→ can’t see counts in progress (in Netscape)

2. could have applet update the HTML text boxes itself


→ tricky (example later)

3. could return more control to the page, applet draws one dot at a time
repetition is handled by JavaScript, can update boxes after each dot
→ slower, but more flexible
JavaScript in control
import java.awt.*;
import java.applet.*;
import java.util.Random;
change applet so that
public class Monte8 extends Applet
{
. . .
method only draws a
public int numInside, numOutside; single dot (repetition to be
. . . controlled by JavaScript)
public void clear()
{
numInside = 0; numOutside = 0;
. . .
} have applet keep track of
public void drawDot()
{
number inside & out
. . .
if (distance(x, y, SIZE/2, SIZE/2) < SIZE/2) {
(can access & display with
offScreenGraphics.setColor(Color.white); JavaScript)
g.setColor(Color.white);
numInside++;
}
else {
offScreenGraphics.setColor(Color.black);
g.setColor(Color.black);
numOutside++;
}
. . .
}
. . .
}
<html>

Example (cont.)
<!-- Monte8.html -->
<head>
<title>Monte Carlo Darts Page</title>
<script type="text/javascript">
function doAll()
{
var numDots = parseFloat(document.MonteForm.numPoints.value);
for (var i = 0; i < numDots; i++) {
document.MonteApplet.drawDot();
}
document.MonteForm.numIn.value = document.MonteApplet.numInside;
document.MonteForm.numOut.value = document.MonteApplet.numOutside;
}
function clearAll()
{ Note: can utilize
document.MonteApplet.drawCircle();
document.MonteForm.numIn.value = 0; HTML table to
document.MonteForm.numOut.value = 0;
}
</script>
achieve desired
</head>
layout of elements
<body bgcolor="gray">
<form name="MonteForm">
<table align="center">
<tr><td><applet code="Monte8.class" name="MonteApplet" height=300 width=300>
You must use a Java-enabled browser to view this applet.
</applet>
<td><input type="button" value="Generate" onClick="doAll();">
<input type="text" name="numPoints" size=6 value=100> points
<p><hr>
<p><input type="text" name="numIn" size=6 value=0> points inside
<p><INPUT TYPE="text" name="numOut" size=6 value=0> points outside
<p><hr>
<p><input type="button" value="Clear the screen" onClick="clearAll()">
</table>
</form>
</body>
</html> view page in browser
Accessing HTML/JavaScript from the applet
it is possible for the applet to access elements in the page
▪ requires the JSObject class from the netscape.javascript package

import netscape.javascript.JSObject;

▪ use getWindow and getMember methods to access components

JSObject jsWin = JSObject.getWindow(this); // GETS WINDOW


JSObject jsDoc = (JSObject) jsWin.getMember("document"); // GETS DOCUMENT

JSObject MonteForm = (JSObject) jsDoc.getMember("MonteForm"); // GETS FORM

numInside = (JSObject) MonteForm.getMember("numIn"); // GETS TEXT BOX

▪ use getMember and setMember methods to access component attributes

int num = Integer.parseInt( (String)numInside.getMember("value") );

numInside.setMember("value", ""+(num+1));
Related topics

JavaBeans
▪ reusable components (e.g., buttons, menus) that can be packaged and reused
▪ requires special tools for compiling and packaging (e.g., BDK)
▪ downloaded with an applet using the ARCHIVES attribute

<applet code="javaApp.class" archives="jarfile.jar">

JAR files
▪ for applets that are comprised of multiple classes, can bundle all necessary files into
a Java Archive (JAR) file
▪ uses the popular ZIP file format
▪ download using ARCHIVES attribute, automatically unzipped by browser
End of Java Applets

You might also like