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");
}
}