Number3.java
1    /* 
2     * Program to paint rows and columns of randomly colored dots based on user input, 
3     * with white space in between each dot. 
4     */
5    
6    package npw;
7    
8    import painter.SPainter;
9    import shapes.SCircle;
10   import javax.swing.*;
11   import java.awt.*;
12   import java.util.Random;
13   import java.util.Scanner;
14   
15   public class Number3 {
16       //The solution to the graphical problem
17       private void paintTheImage() {
18           //Get the input info from the user
19           int nrOfRows = getNumber("rows");
20           int nrOfColumns = getNumber("columns");
21           int sizeOfCircle = getNumber("circle radius");
22           //Establish the painter
23           int height = nrOfRows * sizeOfCircle;
24           int width = nrOfColumns * sizeOfCircle;
25           SPainter miro = new SPainter("Number 3", width*2, height*2);
26           miro.setBrushWidth(4);
27           SCircle circle = new SCircle(sizeOfCircle);
28           //Paint the rectangles
29           paintRectangle(miro, circle, nrOfRows, nrOfColumns);
30       }
31   
32       private static int getNumber(String prompt) {
33           String nss = JOptionPane.showInputDialog(null, prompt+"?");
34           Scanner scanner = new Scanner(nss);
35           return scanner.nextInt();
36       }
37   
38       private static void paintRectangle(SPainter miro, SCircle circle, int nrOfRows, int nrOfColumns) {
39           //Position the painter to paint the rectangle of circles
40           miro.mlt(((nrOfColumns-1)/2.0) * circle.diameter());
41           miro.mbk(((nrOfRows-1)/2.0) * circle.diameter());
42           //Paint the rectangle of circles
43           int i = 1;
44           while(i <= nrOfRows) {
45               paintOneRow(miro, nrOfColumns, circle);
46               miro.mfd(circle.diameter());
47               i++;
48           }
49           //Make the method invariant with respect to pointer position
50           miro.mrt(((nrOfColumns-1)/2.0) * circle.diameter());
51           miro.mfd(((nrOfRows-1)/2.0) * circle.diameter());
52       }
53   
54       private static void paintOneRow(SPainter miro, int nrOfColumns, SCircle circle) {
55           int i = 1;
56           while(i <= nrOfColumns) {
57               paintOneCircle(miro, circle);
58               miro.mrt(circle.diameter());
59               i++;
60           }
61           miro.mlt(nrOfColumns*circle.diameter());
62       }
63   
64       private static void paintOneCircle(SPainter miro, SCircle circle) {
65           circle.s2(); //make dot smaller by half to show white space
66           miro.setColor(randomColor());
67           miro.paint(circle);
68           circle.x2(); //put dot back to regular size so loop doesn't go cray
69       }
70   
71       private static Color randomColor() {
72           Random rgen = new Random();
73           int r = rgen.nextInt(256);
74           int g = rgen.nextInt(256);
75           int b = rgen.nextInt(256);
76           return new Color(r,b,g);
77       }
78   
79       public Number3() {
80           paintTheImage();
81       }
82   
83       public static void main(String[] args) {
84           SwingUtilities.invokeLater(new Runnable() {
85               @Override
86               public void run() {
87                   new Number3();
88               }
89           });
90       }
91   }