Button4

File: java/Button4/Main.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

/**
 * Main program for Button4
 */
public class Main extends JFrame {
    /** The squares */
    private Square square1, square2, square3;

    public static void main (String [] args) {
	new Main ();
    }

    public Main () {
	// Window setup
	setSize (500, 500);
	Container content = getContentPane();
	content.setLayout (new BorderLayout());
	setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

	// Our canvas
	MyCanvas canvas = new MyCanvas (this);
	content.add (canvas, BorderLayout.CENTER);

	/*
	 * Now create the square and its associated buttons
	 */
	square1 = new Square (canvas);

	// Control panel for the square
	JPanel controls1 = new JPanel ();
	controls1.setBorder (new LineBorder(Color.blue));
	controls1.setLayout (new FlowLayout());

	// Create our buttons by instantiating them
	// turns out we don't need to remember them,
	// just to add() them to panel layout
	controls1.add (new ButtonLeft (square1));
	controls1.add (new ButtonRight (square1));
	controls1.add (new ButtonBigger (square1));
	controls1.add (new ButtonSmaller (square1));
	controls1.add (new ButtonFill (square1));

	/*
	 * Another square
	 */
	square2 = new ColSquare (canvas, Color.red);
	
	JPanel controls2 = new JPanel ();
	controls2.setBorder (new LineBorder(Color.blue));
	controls2.setLayout (new FlowLayout());
	
	// Create our buttons
	controls2.add (new ButtonLeft (square2));
	controls2.add (new ButtonRight (square2));
	controls2.add (new ButtonBigger (square2));
	controls2.add (new ButtonSmaller (square2));
	controls2.add (new ButtonFill (square2));

	/*
	 * A third square, of a different color
	 */
	square3 = new ColSquare (canvas, Color.green);
	
	JPanel controls3 = new JPanel ();
	controls3.setBorder (new LineBorder(Color.blue));
	controls3.setLayout (new FlowLayout());
	
	// Create our buttons
	controls3.add (new ButtonLeft (square3));
	controls3.add (new ButtonRight (square3));
	controls3.add (new ButtonBigger (square3));
	controls3.add (new ButtonSmaller (square3));
	controls3.add (new ButtonFill (square3));

	// Need a grid container to hold our panels
	JPanel controls = new JPanel ();
	controls.setLayout (new GridLayout(3, 1));
	controls.add (controls1);
	controls.add (controls2);
	controls.add (controls3);
	content.add (controls, BorderLayout.SOUTH);

	setVisible (true);
    }

    public void drawSquares (Graphics g) {
	// For each square (this could be an array)
	square1.draw (g);
	square2.draw (g);
	square3.draw (g);
    }
}

File: java/Button4/MyCanvas.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class MyCanvas extends JComponent implements MouseListener {
    private Main parent;

    public MyCanvas (Main parent) {
	this.parent = parent;
	setBorder (new LineBorder(Color.blue));
	addMouseListener (this);
    }

    /** Tell parent to do the job */
    public void paintComponent (Graphics g) {
	parent.drawSquares (g);
    }

    /** MouseListener callbacks */
    public void mousePressed (MouseEvent event) {	
	System.out.println ("Mouse down at " + event.getPoint().x + ", " + event.getPoint().y);
    }
    public void mouseClicked (MouseEvent event) {}
    public void mouseReleased (MouseEvent event) {}
    public void mouseEntered (MouseEvent event) {}
    public void mouseExited (MouseEvent event) {}
}

File: java/Button4/Square.java

import java.awt.*;

/**
 * Square holds the "application" data for one square
 */
public class Square {
    private MyCanvas canvas;
    private Rectangle loc = new Rectangle (100, 50, 50, 50);
    private boolean filled = false;

    public Square (MyCanvas canvas) {
	this.canvas = canvas;
    }

    public void draw (Graphics g) {
	Graphics2D g2 = (Graphics2D) g;

	if (filled) g2.fill (loc);
	else g2.draw (loc);
    }

    public void left () {
	loc.x -= 10;
	canvas.repaint();
    }

    public void right () {
	loc.x += 10;
	canvas.repaint();
    }

    public void bigger () {
	loc.width += 10;
	loc.height += 10;
	canvas.repaint();
    }

    public void smaller () {
	loc.width -= 10;
	loc.height -= 10;
	canvas.repaint();
    }
    
    public void setFill (boolean newfill) {
	filled = newfill;
	canvas.repaint();
    }
}

File: java/Button4/ColSquare.java

import java.awt.*;
import javax.swing.*;

/**
 * Specialized subclass of Square
 */
public class ColSquare extends Square {
    private Color color;

    /** Everything the same as superclass, except stash color */
    public ColSquare (MyCanvas canvas, Color color) {
	super (canvas);
	this.color = color;
    }

    /** Piggybacks on super class' code */
    public void draw (Graphics g) {
	Graphics2D g2 = (Graphics2D) g;

	g2.setColor (color);
	super.draw (g);
	g2.setColor (Color.black);
    }
}

File: java/Button4/MyButton.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * Base class for all our buttons
 */
public abstract class MyButton extends JButton implements ActionListener {
    protected Square square;

    public MyButton (Square square) {
	this.square = square;
	addActionListener (this);
    }
}

File: java/Button4/ArrowButton.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * Base class for our buttons that have an arrow on them
 */
public abstract class ArrowButton extends MyButton {
    /* public constants */
    public static final int LEFT = 1;
    public static final int RIGHT = 2;

    public ArrowButton (Square square, int direction) {
	super (square);
	if (direction==LEFT) setIcon (new ImageIcon ("leftArrow.gif"));
	else if (direction==RIGHT) setIcon (new ImageIcon ("rightArrow.gif"));
    }
}

File: java/Button4/TextButton.java

/**
 * Base class for our buttons that have text labels
 */
public abstract class TextButton extends MyButton {
    public TextButton (Square square, String label) {
	super (square);
	setText (label);
    }
}

File: java/Button4/ButtonLeft.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonLeft extends ArrowButton {
    public ButtonLeft (Square square) {
	super (square, LEFT);
    }

    public void actionPerformed (ActionEvent e) {
	square.left();
    }
}

File: java/Button4/ButtonRight.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonRight extends ArrowButton {
    public ButtonRight (Square square) {
	super (square, RIGHT);
    }
    
    public void actionPerformed(ActionEvent e) {
	square.right();
    }
}

File: java/Button4/ButtonSmaller.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonSmaller extends TextButton {
    public ButtonSmaller (Square square) {
	super (square, "Smaller");
    }

    public void actionPerformed(ActionEvent e) {
	square.smaller();
    }
}

File: java/Button4/ButtonBigger.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonBigger extends TextButton {
    public ButtonBigger (Square square) {
	super (square, "Bigger");
    }

    public void actionPerformed(ActionEvent e) {
	square.bigger();
    }
}

File: java/Button4/ButtonFill.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonFill extends TextButton {
    private boolean buttonState = false;
    
    public ButtonFill (Square square) {
	super (square, "Filled");
    }

    public void actionPerformed (ActionEvent e) {
	buttonState = ! buttonState;
	square.setFill (buttonState);

	// Also update button label
	if (buttonState) setText ("Empty");
	else setText ("Filled");
    }
}