DRAWING PROGRAMME

CONTENTS

1. Introduction
2. Programme


1. INTRODUCTION

Here I give an example (taken from Holmes, B. (1998)) that brings together much of the material covereded in the foregoing WWW pages. The result is a simple drawing prohram.



2. PROGRAMME

Table 1 gives the source code and Figure 1 some sample output.

// Draw program
// Frans Coenen
// University of Liverpool, Dept of Comp. Sci.
// Wednesday, 10 January 2001

import java.awt.*;
import java.awt.event.*;

class Draw extends Frame implements 
	ActionListener, 	// menu item
	ItemListener,		// radio buttons
	MouseListener,		// mouse clicks
	MouseMotionListener,	// mouse movement 
	WindowListener {	// Window
	
    /* -------------------------------------------------------- */
    /*                                                          */
    /*                            FIELDS                        */
    /*                                                          */
    /* -------------------------------------------------------- */
    
    static final int WIDTH  = 800;	// Sketch pad width
    static final int HEIGHT = 600;	// Sketch pad height
    int upperLeftX, upperLeftY;	// Rectangle upper left corner coords.
    int width, height;		// Rectangle size
    int  x1, y1, x2, y2;		// Point coords.	
    boolean fillFlag = false;      
    boolean eraseFlag = false;
    String drawColor = new String("black");
    String drawShape = new String("line");
   
    // Help
    
    String helpText = "Draw allows you to sketch different plane shapes over a " +
    	"predefined area.\n" + "A shape may be eother filled or in outline, " +
	"and in one of eight different colours.\n\n" + "The position of the " +
	"mouse on the screen is recorded in the bottom left-hand corner of the " +
	"drawing area. The choice of colour and shape are disoplayed also in the " +
	"left-habnd corner of the drawing area.\n\n" + "The size of a shape is " +
	"determined by the mouse being dragged to the final position and " +
	"released. The first click of the mouse will generate a reference dot on " +
	"the screen. This dot will disapear after the mouse button is released.\n\n" +
	"Both the square and the circle only use the distance measured along the " +
	"horizontal axis when determining the size of a shape.\n\n" + "Upon " +
	"selecting erase, press the mouse button, and move the mouse over the " +
	"area to be erased. releasing the mouse button will deactivate erasure.\n\n" +
	"To erase this text area choose clearpad from the TOOLS menu.\n\n";
	
    // Components
    
    TextField color = new TextField();
    TextField shape = new TextField();
    TextField position = new TextField();
    CheckboxGroup fillOutline = new CheckboxGroup();
    TextArea info = new TextArea(helpText,0,0,TextArea.SCROLLBARS_VERTICAL_ONLY);
    Frame about = new Frame("About Frans draw");
    
    // Menues
    
    String[] colorNames = {"black","blue","cyan","gray","green","magenta","red","white","yellow"};
    String[] shapeNames = {"line","square","rectangle","circle","ellipse"};
    String[] toolNames = {"erase","clearpad"};
    String[] helpNames = {"information","about"};
    
    
    /* -------------------------------------------------------- */
    /*                                                          */
    /*                         CONSTRUCTORS                     */
    /*                                                          */
    /* -------------------------------------------------------- */
    
    public Draw(String heading) {
	super(heading);
        setBackground(Color.yellow);
	setLayout(null);
	
	/* Initialise components */
	
	initialiseTextFields();
	initializeMenuComponents();
	initializeRadioButtons();
	
        addWindowListener(this);
        addMouseListener(this); 
	addMouseMotionListener(this);
	}
	    
    /* -------------------------------------------------------- */
    /*                                                          */
    /*                           METHODS                        */
    /*                                                          */
    /* -------------------------------------------------------- */
    
    /* Initialise Text Fields */
    
    private void initialiseTextFields() {
        // Add text field to show colour of figure
	color.setLocation(5,490);
	color.setSize(80,30);
	color.setBackground(Color.white);
	color.setText(drawColor);
	add(color);
	
	// Add text field to show shape of figure
	shape.setLocation(5,525);
	shape.setSize(80,30);
	shape.setBackground(Color.white);
	shape.setText(drawShape);
	add(shape);
	
        // Add text field to show position of mouse
	position.setLocation(5,560);
	position.setSize(80,30);
	position.setBackground(Color.white);
	add(position);
	
	// Set up text field for help
	info.setLocation(150,250);
	info.setSize(500,100);
	info.setBackground(Color.white);
	info.setEditable(false);
	}
    
    /* Initialize Menu Components */
    
    private void initializeMenuComponents() {
        // Create menu bar
                                          
        MenuBar bar = new MenuBar();
        
	// Add colurs menu
	
	Menu colors = new Menu("COLORS");
	for(int index=0;index < colorNames.length;index++)
					colors.add(colorNames[index]); 	   
	bar.add(colors);
	colors.addActionListener(this);
	
	// Add shapes menu
	
	Menu shapes = new Menu("SHAPES");
	for(int index=0;index < shapeNames.length;index++)
					shapes.add(shapeNames[index]); 	   
	bar.add(shapes);
	shapes.addActionListener(this);

	// Add tools menu
	
	Menu tools = new Menu("TOOLS");
	for(int index=0;index < toolNames.length;index++)
					tools.add(toolNames[index]); 	   
	bar.add(tools);
	tools.addActionListener(this);
	
	// Add help menu
	
	Menu help = new Menu("HELP");
	for(int index=0;index < helpNames.length;index++)
					help.add(helpNames[index]); 	   
	bar.add(help);
	help.addActionListener(this);
	
	// Set up menu bar
	
	setMenuBar(bar);
	}
    
    /* Initilalise Radio Buttons */
    
    private void initializeRadioButtons() {
        
	// Define checkbox
	
	Checkbox fill = new Checkbox("fill",fillOutline,false);
	Checkbox outline = new Checkbox("outline",fillOutline,true);
	
	// Fill buttom
	
	fill.setLocation(5,455);
	fill.setSize(80,30);
	add(fill);
	fill.addItemListener(this);
	
	// Outline button
	
	outline.setLocation(5,420);
	outline.setSize(80,30);
	add(outline);
	outline.addItemListener(this);
	}
		
    /* -------------------------------------------------------- */
    /*                                                          */
    /*                          LISTENERS                       */
    /*                                                          */
    /* -------------------------------------------------------- */
    
    // ----------------------- ACTION LISTENERS -------------------
    
    /* Action performed. Detects which item has been selected from a menu */
                                                           
    public void actionPerformed(ActionEvent event) {
        Graphics g = getGraphics();
	
	String source = event.getActionCommand();
	
	// Identify chosen colour if any
	
	for (int index=0;index < colorNames.length;index++) {
	    if (source.equals(colorNames[index])) {
	    	drawColor = colorNames[index];
		color.setText(drawColor);
		return;
		}
	    }
	
	// Identify chosen shape if any

	for (int index=0;index < shapeNames.length;index++) {
	    if (source.equals(shapeNames[index])) {
	    	drawShape = shapeNames[index];
		shape.setText(drawShape);
		return;
		}
	    }
	
	// Identify chosen tools if any
	
	if (source.equals("erase")) {
	     eraseFlag= true;
	     return;
	     }
	else {
	    if (source.equals("clearpad")) {
	    	remove(info);
		g.clearRect(0,0,800,600);
		return;
		}
	    }
	
	// Identify chosen help

	if (source.equals("information")) {
	     add(info);
	     return;
	     }
	else displayAboutWindow(about);
	}	
    
    /* Dispaly About Window: Shows iformation aboutb Draw programme in
    separate window */
    
    private void displayAboutWindow(Frame about) {
        about.setLocation(300,300);
	about.setSize(350,160);
	about.setBackground(Color.cyan);
	about.setFont(new Font("Serif",Font.ITALIC,14));
	about.setLayout(new FlowLayout(FlowLayout.LEFT));
	
	about.add(new Label("Author: Frans Coenen"));
	about.add(new Label("Title: Draw"));
	about.add(new Label("Location: University of Liverpool, Dept of Comp. Sci."));
        about.add(new Label("Date: Wednesday, 10 January 2001"));
	about.add(new Label("Based on original idea by Barry Holmes"));
	about.setVisible(true);
	about.addWindowListener(this);
	}
	 
    // ----------------------- ITEM LISTENERS -------------------
    
    /* Item state changed: detect radio button presses. */
    
    public void itemStateChanged(ItemEvent event) {
	if (event.getItem() == "fill") fillFlag=true;
	else if (event.getItem() == "outline") fillFlag=false;
	}
		
    // ---------------------- MOUSE LISTENERS -------------------

    /* Blank mouse listener methods  */
                           
    public void mouseClicked(MouseEvent event) {}
    public void mouseEntered(MouseEvent event) {}
    public void mouseExited(MouseEvent event) {}
                               
    /* Mouse pressed: Get start coordinates */
                           
    public void mousePressed(MouseEvent event) {
        
	// Cannot draw if erase flag switched on.
	
	if (eraseFlag) return;
	
	// Else set parameters to 0 and proceed
	upperLeftX=0;
	upperLeftY=0;
	width=0;
	height=0;
	
	x1=event.getX();
	y1=event.getY();
	
	Graphics g = getGraphics();
	
	// Display start point
	
	g.drawString(".",x1,y1);
	displayMouseCoordinates(x1,y1);
	}

    public void mouseReleased(MouseEvent event) {
        Graphics g = getGraphics();
	
	// Get and display mouse coordinates
	
	x2=event.getX();
	y2=event.getY();
	displayMouseCoordinates(x2,y2);
	
	// If erase flag set to true reset to false
	
	if (eraseFlag) {
	    eraseFlag = false;
	    return;
	    }	
	
	// Else draw shape
	
	selectColor(g);
	if (drawShape.equals("line")) g.drawLine(x1,y1,x2,y2);
	else drawClosedShape(drawShape,g);
	
	// Remove reference point
	
	g.setColor(Color.yellow);
	g.drawString(".",x1,y1);
	g.setColor(Color.black);
	}
    
    /* Display Mouse Coordinates */
    	
    private void displayMouseCoordinates(int x, int y) {
    	position.setText("[" + String.valueOf(x) + "," + String.valueOf(y) + "]");
	}		
    
    /* Select colour */
    
    private void selectColor(Graphics g) {
        for (int index=0;index < colorNames.length;index++) {
	    if (drawColor.equals(colorNames[index])) {
	        switch(index) {
		    case 0: g.setColor(Color.black);break;
		    case 1: g.setColor(Color.blue);break;
		    case 2: g.setColor(Color.cyan);break;
		    case 3: g.setColor(Color.gray);break;
		    case 4: g.setColor(Color.green);break;
		    case 5: g.setColor(Color.magenta);break;
		    case 6: g.setColor(Color.red);break;
		    case 7: g.setColor(Color.white);break;
		    default: g.setColor(Color.yellow);
		    }
		}
	    }
	}

    /* Draw closed shape */
    
    private void drawClosedShape(String shape,Graphics g) {
        // Calculate correct parameters for shape
	
	upperLeftX = Math.min(x1,x2);
	upperLeftY = Math.min(y1,y2);
	width = Math.abs(x1-x2);
	height = Math.abs(y1-y2);
	
	// Draw appropriate shape
	
	if (shape.equals("square")) {
	    if (fillFlag) g.fillRect(upperLeftX,upperLeftY,width,width);
	    else g.drawRect(upperLeftX,upperLeftY,width,width);
	    }
	else {
	    if (shape.equals("rectangle")) {
	        if (fillFlag) g.fillRect(upperLeftX,upperLeftY,width,height);
	        else g.drawRect(upperLeftX,upperLeftY,width,height);
		}
	    else {
	        if (shape.equals("circle")) {
		    if (fillFlag) g.fillOval(upperLeftX,upperLeftY,width,width);
	            else g.drawOval(upperLeftX,upperLeftY,width,width);
		    }
		else {
		    if (fillFlag) g.fillOval(upperLeftX,upperLeftY,width,height);
	            else g.drawOval(upperLeftX,upperLeftY,width,height);
		    }    
		}	
	    }    
	}
	 
    // ----------------------- MOUSE MOVEMENT --------------------
    
    /* Mouse moved */
                               
    public void mouseMoved(MouseEvent event) {
        displayMouseCoordinates(event.getX(),event.getY());
	}

    /* Mouse dragged */
                                   
    public void mouseDragged(MouseEvent event) {
        Graphics g = getGraphics();
	
	x2=event.getX();
	y2=event.getY();
	
	if (eraseFlag) g.clearRect(x2,y2,5,5);
	displayMouseCoordinates(x1,y1);
	}
                                   
    // ---------------------- WINDOW LISTENERS -------------------
                           
    /* Blank methods for window listener */
                           
    public void windowClosed(WindowEvent event) {}
    public void windowDeiconified(WindowEvent event) {}
    public void windowIconified(WindowEvent event) {}
    public void windowActivated(WindowEvent event) {}
    public void windowDeactivated(WindowEvent event) {}
    public void windowOpened(WindowEvent event) {}

    /* Window Closing */
                           
    public void windowClosing(WindowEvent event) {
        if (event.getWindow() == about) {
	    about.dispose();
	    return;
	    }
	else System.exit(0);
        } 
    }
                           
/* --------------------------------------------------------------- */
/*                                                                 */
/*                             DRAW APP                            */
/*                                                                 */
/* --------------------------------------------------------------- */
                           
class DrawApp {
                           
    /* Main  method */    
                           
    public static void main(String[] args) {
        Draw screen = new Draw("Frans draw");
                               
        screen.setSize(Draw.WIDTH,Draw.HEIGHT);
        screen.setVisible(true);
        }
    }

Table 1:Drawing programme

DRAWING GUI

Figure 21: Example output from code presented in Table 1




3. REFERENCES

  1. Holmes, B. (1998). Programming with Java. Jones and Bartlett, Boston MA, p411.



Created and maintained by Frans Coenen. Last updated 04 February 2002