Number4.java
package npw;

import java.awt.*;
import java.util.Random;
import java.util.Scanner;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

import painter.SPainter;
import shapes.SCircle;

public class Number4 {

    private void paintTheImage() {
        //get the input information from the user.
        int nrOfRows = getNumber("rows");
        int nrOfColumns = getNumber("columns");
        int diameterOfCircle = getNumber("diameter of circle");
        String color = getColor("color of circle");
        //establish the painter
        int height = nrOfRows * diameterOfCircle;
        int width = nrOfColumns * diameterOfCircle;
        SPainter miro = new SPainter("Number 4", width + 50, height + 50);
        miro.setBrushWidth(4);
        SCircle circle = new SCircle(diameterOfCircle / 2);
        //paint the rectangles
        paintRectangle(miro, circle, nrOfRows, nrOfColumns, color);
    }

    private static int getNumber(String prompt){
        String nss = JOptionPane.showInputDialog(null, prompt + "?");
        Scanner scanner = new Scanner(nss);
        return scanner.nextInt();
    }

    private String getColor(String prompt) {
        String color = JOptionPane.showInputDialog(null, prompt + "?");
        Scanner scan = new Scanner(color);
        return scan.next();
    }

    private static void paintRectangle(SPainter miro, SCircle circle, int nrOfRows, int nrOfColumns, String color){
        //position the painter to paint the rectangle of squares.
        miro.mlt(((nrOfColumns - 1) / 2.0) * circle.diameter());
        miro.mbk(((nrOfRows - 1) / 2.0) * circle.diameter());
        //paint the rectangle of squares
        int i = 1;
        while ( i <= nrOfRows ){
            paintOneRow(miro, nrOfColumns, circle, color);
            miro.mfd(circle.diameter());
            i = i + 1;
        }
        //make the method invariant with respect to painter position
        miro.mrt(((nrOfColumns - 1) / 2.0) * circle.diameter());
        miro.mfd(((nrOfRows - 1 ) / 2.0) * circle.diameter());
    }

    private static void paintOneRow(SPainter miro, int nrOfColumns, SCircle circle, String color){
        int i = 1;
        while( i <= nrOfColumns){
            paintOneCircle(miro, circle, color);
            miro.mrt(circle.diameter());
            i = i +1;
        }
        miro.mlt(nrOfColumns * circle.diameter());
    }

    private static void paintOneCircle(SPainter miro, SCircle circle, String color) {
        circle.s2();
        if (color.equalsIgnoreCase("blue")) {
            miro.setColor(Color.BLUE);
            miro.paint(circle);
        } else if (color.equalsIgnoreCase("red")) {
            miro.setColor(Color.RED);
            miro.paint(circle);
        } else if (color.equalsIgnoreCase("green")) {
            miro.setColor(Color.GREEN);
            miro.paint(circle);
        } else {
            miro.setColor(Color.BLACK);
            miro.paint(circle);
        }
        circle.x2();
    }
    private static Color randomColor(){
        Random rgen = new Random();
        int r = rgen.nextInt(256);
        int g = rgen.nextInt(256);
        int b = rgen.nextInt(256);
        return new Color (r, b ,g);
    }
    public Number4(){
        paintTheImage();
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
              @Override
              public void run() {
                  new npw.Number4();
              }
        });
    }
}