Number4.java
package npw;
import java.awt.Color;
import java.util.Scanner;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import painter.SPainter;
import shapes.SCircle;

public class Number4 {
    //Solution to the graphical problem.
    private void paintTheImage() {
        //Get the input info from the user.
        int numOfRows = getNumber("rows");
        int numOfColumns = getNumber("columns");
        int sizeOfCircle = getNumber("circle side length");
        String whatColor = getColor("Choose the color of dots| Green, Blue and, Red");
        //Establishing the painter.
        int height = numOfRows * sizeOfCircle;
        int width = numOfColumns * sizeOfCircle;
        SPainter miro = new SPainter("Number 4",width+50,height+50);
        miro.setBrushWidth(4);
        SCircle circle = new SCircle(sizeOfCircle);
        //paint the rectangles
        paintCircle(miro,circle,numOfRows,numOfColumns, whatColor);
    }

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

    private int getNumber(String prompt) {
        String nss = JOptionPane.showInputDialog(null,prompt+"?");
        Scanner scan = new Scanner(nss);
        return scan.nextInt();
    }
    private void paintCircle(SPainter miro, SCircle circle, int numOfRows, int numOfColumns, String whatColor) {
        //Position the painter to paint the rectangle of circles.
        miro.mlt(((numOfColumns-1)/2.0)*circle.radius());
        miro.mbk(((numOfRows-1)/2.0)*circle.radius());
        //Paint the rectangle of circles.
        int i = 1;
        while (i <= numOfRows) {
            paintOneRow(miro,numOfColumns,circle, whatColor);
            miro.mfd(circle.radius());
            i = i + 1;
        }
        //Used to make method invariant with respect to painter position.
        miro.mrt(((numOfColumns-1)/2.0)*circle.radius());
        miro.mfd(((numOfColumns-1)/2.0)*circle.radius());
    }

    private void paintOneRow(SPainter miro, int numOfColumns, SCircle circle, String whatColor) {
        int i = 1;
        while (i <= numOfColumns) {
            paintOneCircle(miro,circle, whatColor);
            miro.mrt(circle.radius());
            i = i + 1;
        }
        //invariant
        miro.mlt(numOfColumns*circle.radius());
    }

    private void paintOneCircle(SPainter miro, SCircle circle, String whatColor) {
        circle.setRadius(((int) circle.radius())/4);
        if (whatColor.equalsIgnoreCase("green")) {
            miro.setColor(Color.GREEN);
        } else if (whatColor.equalsIgnoreCase("red")) {
            miro.setColor(Color.RED);
        } else if (whatColor.equalsIgnoreCase("blue")) {
            miro.setColor(Color.BLUE);
        } else {
            miro.setColor(Color.BLACK);
        }
        miro.paint(circle);
        circle.setRadius(((int) circle.radius())*4);



    }

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