Number3.java
package npw;

import painter.SPainter;
import shapes.SCircle;

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

public class Number3 {
    //The solution to the graphical problem
    private void paintTheImage() {
        //Get the input information from the user.
        int nrOfRows = getNumber("rows");
        int nrOfColumns = getNumber("columns");
        int sizeOfCircle = getNumber("Circle radius length");
        //Establish the painter
        int height = nrOfRows * sizeOfCircle;
        int width = nrOfColumns * sizeOfCircle;
        SPainter miro = new SPainter("Number 3", (height * 2)+50, (width * 2)+50);
        miro.setBrushWidth(4);
        SCircle dot = new SCircle(sizeOfCircle);
        //Paint the rectangles
        paintRectangle(miro, dot, nrOfRows, nrOfColumns);
    }

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

    private static void paintRectangle(SPainter miro, SCircle dot, int nrOfRows, int nrOfColumns) {
        //Position the painter to paint the rectangle of squares.
        miro.mlt(((nrOfColumns - 1) / 2.0) * dot.diameter());
        miro.mbk(((nrOfRows - 1) / 2.0) * dot.diameter());
        //Paint the rectangle of squares.
        int i = 1;
        while (i <= nrOfRows) {
            paintOneRow(miro, nrOfColumns, dot);
            miro.mfd(dot.diameter());
            i = i + 1;

        }
        //Make the method invariant with respect to the painter position
        miro.mrt(((nrOfColumns - 1) / 2.0) * dot.diameter());
        miro.mfd(((nrOfRows - 1) / 2.0) * dot.diameter());
    }

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

    private static void paintOneCircle(SPainter miro, SCircle dot) {
        dot.s2();
        miro.setColor(randomColor());
        miro.paint(dot);
        dot.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 Number3() {
        paintTheImage();
    }

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