Button2

File: java/Button2/Main.java

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

/**
 * Main program for Button2
 */
public class Main extends JFrame
implements ActionListener {
    /** Miscellaneous "global" data, we keep here */
    private Rectangle square = new Rectangle (100, 50, 50, 50);
    private boolean filled = false; // currently filled or not?

    /** Remember these for listener callbacks */
    private MyCanvas canvas;
    private JButton bleft, bright, bbigger, bsmaller, bfill;

    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
	canvas = new MyCanvas (this);
	content.add (canvas, BorderLayout.CENTER);

	// Control panel at bottom
	JPanel controls = new JPanel ();
	controls.setBorder (new LineBorder(Color.blue));
	controls.setLayout (new FlowLayout());
	content.add (controls, BorderLayout.SOUTH);

	// First button, left arrow
	bleft = new JButton ();
	bleft.setIcon (new ImageIcon ("leftArrow.gif"));
	bleft.addActionListener (this);
	controls.add (bleft);

	// Right arrow button
	bright = new JButton ();
	bright.setIcon (new ImageIcon ("rightArrow.gif"));
	bright.addActionListener (this);
	controls.add (bright);

	// "Bigger" button
	bbigger = new JButton ();
	bbigger.setText ("Bigger");
	bbigger.addActionListener (this);
	controls.add (bbigger);

	// "Smaller" button
	bsmaller = new JButton ();
	bsmaller.setText ("Smaller");
	bsmaller.addActionListener (this);
	controls.add (bsmaller);

	// "Filled" button
	bfill = new JButton ();
	bfill.setText ("Filled");
	bfill.addActionListener (this);
	controls.add (bfill);

	setVisible (true);
    }

    /**
     * Canvas calls us to do the job, cause we keep the data
     * We draw, according to current values of square and filled
     */
    public void drawSquare (Graphics g) {
	Graphics2D g2 = (Graphics2D) g;

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

    /** Uses button ivars to decode */
    public void actionPerformed (ActionEvent e) {
	if (e.getSource()==bleft) {
	    square.x -= 10;
	    canvas.repaint ();
	}
	else if (e.getSource()==bright) {
	    square.x += 10;
	    canvas.repaint ();
	}
	else if (e.getSource()==bbigger) {
	    square.width += 10;
	    square.height += 10;
	    canvas.repaint ();
	}
	else if (e.getSource()==bsmaller) {
	    square.width -= 10;
	    square.height -= 10;
	    canvas.repaint ();
	}
	else if (e.getSource()==bfill) {
	    filled = ! filled;
	    canvas.repaint ();

	    // Also update button label
	    if (filled) bfill.setText ("Empty");
	    else bfill.setText ("Filled");
	}
    }
}

File: java/Button2/MyCanvas.java

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

/**
 * Our canvas
 */
public class MyCanvas extends JComponent implements MouseListener {
    private Main parent;

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

    /** We just call our parent, cause it keeps the data */
    public void paintComponent (Graphics g) {
	parent.drawSquare (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) {}
}