Invention1.java
1    package npw;
2    
3    import painter.SPainter;
4    import  shapes.SCircle;
5    import shapes.SSquare;
6    
7    import javax.swing.*;
8    import java.awt.*;
9    import java.util.Random;
10   import java.util.Scanner;
11   
12   import static javax.swing.UIManager.getColor;
13   import static javax.swing.UIManager.getString;
14   
15   
16   public class Invention1 {
17   
18       public static void main(String[] args) {
19           SwingUtilities.invokeLater(new Runnable() {
20               public void run() {
21                   new Invention1();
22               }
23           });
24       }
25   
26       public Invention1() {
27           paintTheImage();
28       }
29   
30       private String inputColor = getString( "dot color" );
31       private int dotSpacing = getNumber("column width");
32       private int width = getNumber("width");
33       private int height = getNumber("height");
34   
35       public void paintTheImage() {
36           // Establish the painter
37           SPainter painter = new SPainter("Invention 1", width, height);
38           SCircle dot = new SCircle(5);
39           SSquare box = new SSquare(5);
40   
41           // Move the painter to the upper left corner to get ready to paint the gradient
42           painter.mfd(height / 2);
43           painter.tl(90);
44           painter.mfd(width / 2 - 10);
45           painter.tl(90);
46   
47           // Paint it!
48           paintGradient(painter, dot, box, height, width, dotSpacing);
49       }
50   
51   
52       private static int getNumber(String prompt) {
53           String nss = JOptionPane.showInputDialog(null,prompt+"?");
54           Scanner scanner = new Scanner(nss);
55           return scanner.nextInt();
56       }
57   
58       private void paintGradient(SPainter painter, SCircle dot, SSquare box, int height, int width, int dotSpacing) {
59           int cols = 0;
60           // Calculate the number of columns. We want to fill the screen but we don't want
61           //any of the dots only half on the canvas, so we subtract some space.
62           int nrOfCols = ( width / dotSpacing) - 2;
63   
64           while (cols < nrOfCols){
65               nextCol(painter, dotSpacing);
66               paintColumn(painter, dot, box, height, dotSpacing);
67               cols = cols + 1;
68           }
69       }
70   
71   
72   
73       // Dots are spaced tighter together near the bottom of the canvas.
74       private void paintColumn(SPainter painter, SCircle dot, SSquare box, int height, int dotSpacing) {
75           int travel = 0;
76           int totalDistanceTraveled = 0;
77   
78           // Paint a row with decreasing distance between dots.
79           while(totalDistanceTraveled < height - (dot.radius() * 3)) {
80               travel = dotSpacing;
81               totalDistanceTraveled = totalDistanceTraveled + travel;
82               painter.mfd(travel);
83               paintOneDot(painter, dot, box, totalDistanceTraveled);
84           }
85   
86           // Make the method invariant with respect to painter position.
87           painter.mbk(totalDistanceTraveled);
88   
89       }
90   
91       private void paintOneDot(SPainter painter, SCircle dot, SSquare box, int totalDistanceTraveled) {
92           dynamicColor(painter);
93           if (totalDistanceTraveled < 300) {
94               painter.paint(dot);}
95           else {
96               painter.paint(box);}
97       }
98   
99       private static String getString(String prompt) {
100          String nss = JOptionPane.showInputDialog(null,prompt+"?");
101          Scanner scanner = new Scanner(nss);
102          return scanner.next();
103  
104      }
105  
106      private void dynamicColor(SPainter painter) {
107          Random rgen = new Random();
108          if (inputColor.equalsIgnoreCase("red")) {
109              painter.setColor(Color.RED);
110          } else if (inputColor.equalsIgnoreCase("green")) {
111              painter.setColor(Color.GREEN);
112          } else if (inputColor.equalsIgnoreCase("blue")) {
113              painter.setColor(Color.BLUE);
114          } else {
115              painter.setColor(Color.BLACK);
116          }
117      }
118  
119      private void nextCol(SPainter painter,int dotSpacing){
120          painter.tl(90);
121          painter.mfd(dotSpacing);
122          painter.tr(90);
123      }
124  
125  
126  }