Canvas
ClassCanvas
class represents a rectangular area to be used for
displaying graphical images. It has the following paint
method:
So, if you want to see something of interest on a canvas, you have create a subclass ofpublic void paint(Graphics g) { g.setColor(getBackground()); g.fillRect(0, 0, width, height); }
Canvas
and
override the paint
method in this subclass.
In this subclass you can also override event-handling methods for
mouse and keyboard events such as the methods
mouseDown
and mouseDrag
;
the Canvas
class does by default nothing with them.
The following example is an applet that consists of a yellow canvas for drawing and a button to clear the drawing area.
import java.applet.*; import java.awt.*; public class ScratchpadApplet extends Applet { Button clearButton; Scratchpad scratchpad; public void init() { // create GUI components clearButton = new Button("clear"); scratchpad = new Scratchpad(); // layout GUI components in applet setLayout(new BorderLayout()); add("South", clearButton); add("Center", scratchpad); } public boolean action(Event evt, Object arg){ if (evt.target == clearButton) { scratchpad.clear(); // clear canvas } return true; } }The two components in the example applet, viz., the button and the canvas, are laid out with a so-called
BorderLayout
.
The scrollbar is placed in the southern region and the canvas is placed
in the central position. With the components laid out in this way
you get an applet which is rather pretty. In other layouts, for example in
FlowLayout
, the canvas would display as a very small and
easily overlooked square.
We shall come back to layouts in the next section.
import java.awt.*; import java.util.*; public class Scratchpad extends Canvas { Vector points = new Vector(); Scratchpad () { setBackground(Color.yellow); } public boolean mouseDown(Event evt, int x, int y) { points.addElement(new Point(x, y)); return true; } public boolean mouseDrag(Event evt, int x, int y) { points.addElement(new Point(x, y)); repaint(); return true; } public boolean mouseUp (Event evt, int x, int y) { points.addElement(null); return true; } public void paint(Graphics g) { Enumeration e = points.elements(); Point lastPt = null; while (e.hasMoreElements()) { Point pt = (Point) e.nextElement(); if (lastPt != null && pt != null) { g.drawLine(lastPt.x, lastPt.y, pt.x, pt.y); } lastPt = pt; } } public void clear() { points = new Vector(); repaint(); } }For the canvas we have only changed the Java code for responding to mouse up, down and dragging. What we do is connect the point last visited by a straight line with the current point. At a mouse-up, a null object is added to the vector. We use this to skip drawing until the next mouse-down. In a later session we shall thoroughly discuss event handling. Note moreover that if the vector becomes larger, the screen will probably flicker. We will offer ways to overcome this in the section on applet graphics.