ButtonApp3 (other files are same as before): Button.java

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

/**
 * Base class for all our buttons
 */
public abstract class Button extends JButton implements ActionListener {
    protected Square square; //*1 Common to all our buttons
    protected Square.ButtonAction action; //*1

    public Button (Square square, Square.ButtonAction action) {
	this.square = square; //*1
	this.action = action; //*1
	setBorder (new LineBorder(Color.GREEN, 2)); //*1
	addActionListener (this); //*2 Shared routine, parameterized by "action" supplied by subclass
    }

    public void actionPerformed (ActionEvent e) { //*2
	square.doAction (action); //*2
    }
}
[download file]