SimpleDots.java
package npw;
import painter.SPainter;
import shapes.SCircle;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import java.awt.*;
import java.util.Random;
import java.util.Scanner;

public class SimpleDots {


    public static void main(String[] args) {
        SwingUtilities.invokeLater(SimpleDots::new);
    }

    public SimpleDots() {
        paintTheImage();
    }

    private void paintTheImage() {
        // Grab the input information
        int width = getNumber("width");
        int height = getNumber("height");
        int dotSpace = getNumber("horizontal and vertical space between dots");
        // Establish the painter
        SPainter painter = new SPainter("HirstDots", width, height);
        SCircle dot = new SCircle(5);

        // Move the painter to the upper left corner to get ready to paint the gradient
        painter.mfd(height / 2.0);
        painter.tl();
        painter.mfd(width / 2.0);
        painter.tl();
        color(painter);
        // Paint it!
        paintGradient(painter, dot, height, width, dotSpace);
    }

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

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

    private void paintGradient(SPainter painter, SCircle dot, int height, int width, int dotSpace) {
        // Calculate the number of columns. We want to fill the screen, but don't want any columns half on the canvas.
        // A column takes up the horizontal space of a dot's diameter plus the space between it and a neighbor.
        double colWidth = dot.diameter() + dotSpace;
        // We don't want a column all the way on the edge on the right side, so subtract 1.
        int nrOfCols = (int) Math.floor((width / colWidth)) - 1;
        int cols = 0;
        while (cols < nrOfCols) {
            nextCol(painter, dot, dotSpace);

            paintColumn(painter, dot, height);

            cols = cols + 1;
        }

    }

    private void paintOneDot(SPainter painter, SCircle dot) {
        painter.paint(dot);
    }

    public void color(SPainter painter) {
            String command = JOptionPane.showInputDialog(null, "Color?");
            if (command == null) {
                command = "exit";
            }//user clicked on Cancel
            if (command.equalsIgnoreCase("blue")) {
                painter.setColor(Color.BLUE);
            } else if (command.equalsIgnoreCase("red")) {
                painter.setColor(Color.RED);
            } else if (command.equalsIgnoreCase("green")) {
                painter.setColor(Color.GREEN);
            } else if (command.equalsIgnoreCase("help")) {
                JOptionPane.showMessageDialog(null, "Valid commands are:" + "RED, BLUE, GREEN, HELP, EXIT");
            } else if (command.equalsIgnoreCase("exit")) {
                painter.end();
                System.out.println("Thank you for viewing the simple dots...");

            } else {
                painter.setColor(Color.BLACK);

            }
        }

        // Dots are spaced more tightly together near the bottom of the canvas.
        private void paintColumn (SPainter painter, SCircle dot,int height){
            int totalDistanceTraveled = 0;

            // Paint a column with decreasing distance between dots.
            while (totalDistanceTraveled < height - (dot.radius() * 3)) {
                int travel = ((int) dot.diameter() * 2);
                totalDistanceTraveled = totalDistanceTraveled + travel;
                painter.mfd(travel);
                paintOneDot(painter, dot);
            }

            // Make the method invariant with respect to painter position.
            painter.mbk(totalDistanceTraveled);
        }

        // Moves the painter to the next column.
        private void nextCol (SPainter painter, SCircle dot,int dotSpace){
            painter.tl();
            painter.mfd(dot.diameter() + dotSpace);
            painter.tr();
        }


    }