Number1.java
1    /* 
2     * Program to paint a rectangle, centered on the canvas, made up of randomly 
3     * colored, black framed squares 
4     */
5    
6    package npw;
7    
8    import java.awt.Color;
9    import java.util.Random;
10   import java.util.Scanner;
11   import javax.swing.JOptionPane;
12   import javax.swing.SwingUtilities;
13   
14   import painter.SPainter;
15   import shapes.SSquare;
16   
17   public class Number1 {
18       //the solution to the graphical problem
19       private void paintTheImage() {
20           //get the input information from the user
21           int nrOfRows = getNumber("rows");
22           int nrOfColumns = getNumber("columns");
23           int sizeOfSquare = getNumber("square side length");
24           //establish the painter
25           int height = (nrOfRows * sizeOfSquare);
26           int width = (nrOfColumns * sizeOfSquare);
27           SPainter miro = new SPainter("Number1",width + 50,height + 50);
28           miro.setBrushWidth(4);
29           SSquare square = new SSquare(sizeOfSquare);
30           //paint the rectangles
31           paintTheRectangle(miro,square,nrOfRows,nrOfColumns);
32       }
33   
34       private int getNumber(String prompt) {
35           String nss = JOptionPane.showInputDialog(null,prompt+"?");
36           Scanner scanner = new Scanner(nss);
37           return scanner.nextInt();
38       }
39   
40       private void paintTheRectangle(SPainter miro, SSquare square, int nrOfRows, int nrOfColumns) {
41           //position the painter to paint the rectangle of squares
42           miro.mlt(((nrOfColumns-1)/2.0) * square.side());
43           miro.mbk(((nrOfRows-1)/2.0) * square.side());
44           //paint the rectangle of squares
45           int i = 1;
46           while (i <= nrOfRows) {
47               paintOneRow(miro,nrOfColumns,square);
48               miro.mfd(square.side());
49               i = i+1;
50           }
51           //make the method invariant with respect to painter position
52           miro.mrt(((nrOfColumns-1)/2.0) * square.side());
53           miro.mfd(((nrOfRows-1)/2.0) * square.side());
54       }
55   
56       private void paintOneRow(SPainter miro, int nrOfColumns, SSquare square) {
57           int k = 1;
58           while (k <= nrOfColumns) {
59               paintOneSquare(miro,square);
60               miro.mrt(square.side());
61               k = k+1;
62           }
63           //make the method invariant with respect to painter position
64           miro.mlt(nrOfColumns*square.side());
65       }
66   
67       private void paintOneSquare(SPainter miro, SSquare square) {
68           miro.setColor(randomColor());
69           miro.paint(square);
70           miro.setColor(Color.BLACK);
71           miro.draw(square);
72       }
73   
74       private Color randomColor() {
75           Random rgen = new Random();
76           int r = rgen.nextInt(256);
77           int g = rgen.nextInt(256);
78           int b = rgen.nextInt(256);
79           return new Color(r,b,g);
80       }
81   
82       public Number1() {
83           paintTheImage();
84       }
85       public static void main(String[] args) {
86           SwingUtilities.invokeLater(new Runnable() {
87               @Override
88               public void run() {
89                   new Number1();
90               }
91           });
92       }
93   
94   }
95