I can't figure out why this isn't working!

• November 15th, 2012, 09:35 AM
samjoyboy
I can't figure out why this isn't working!
On my current assignment I have to create a brick wall of multi-coloured tiles in java. All using blueJ and as you can see below my code on the "drawRow" method won't work, it just draws a single row and wont actually draw 4 rows with 8 bricks by length when I ask it to. Please help me and ask if you need more info...

Code :

```import java.util.ArrayList; /** * Write a description of class BrickWall here. * * @author (your name) * @version (a version number or a date) */ public class BrickWall { // instance variables - replace the example below with your own private Integer bWidth; private Integer bHeight; private Integer numRows; private Integer rowLength; private ArrayList<String> colors; private ArrayList<Rectangle> bricks; private Boolean decrease; private Boolean isSymmetric; private Boolean isMultiColor; private Integer currentColor; private Integer startX; private Integer startY; private Rectangle brick;   /** * Constructor for objects of class BrickWall. * @param rows The number of rows in the wall * @param rowlen The maximum number of bricks in a row * @param isMultiColor when false all bricks are the same colour. When true the colours cycle through the 6 colours. * @param decrease If true subtract 2 from rowLen for each row drawn * @param isSymmetric if decrease is greater than 0 and isSymmetric is true the wall is a pyramid shape, otherwise it is a rectangle or a right angle triangle. */ public BrickWall(Integer rows, Integer rowLen) { // initialise instance variables setUpColors(); bWidth = 54; bHeight = 16; startX = 10; startY = 550; bricks = new ArrayList<Rectangle>(); currentColor = 0; setNumRows(rows); setRowLength(rowLen); this.isMultiColor = false; this.decrease = false; this.isSymmetric = false; }   private void setUpColors() { colors = new ArrayList<String>(); colors.add("red"); colors.add("yellow"); colors.add("blue"); colors.add("green"); colors.add("magenta"); colors.add("black"); }   /** * Toggle whether the wall is multicoloured. */ public void toggleMultiColour() { isMultiColor = !isMultiColor; currentColor = 0; }   /** * Toggle whether the decrease in a row length is symmetric. */ public void toggleSymmetric() { isSymmetric = !isSymmetric; }   /** * Toggle whether the length of a new row is one less than the length of the previous row. */ public void toggleDecrease() { decrease = ! decrease; }   /** * @return the number of bricks in the current wall. */ public Integer getNumberOfBricks() { return bricks.size(); }   /** * Set the length of a row. There can be no more than 22 bricks in a row. * @param len The number of bricks in a row. If len is less than or equal * to zero OR len is greater than 22, the row length will be assigned the value 22. * Otherwise the length of a row will be assigned the value of len. */ public void setRowLength(Integer len) { if (len <= 0 || len > 22) { rowLength = 22; } else { rowLength = len; } }   /** * Set the maximum number of rows in the wall. If the length of a row decreases, * there may not be this many rows in the wall. * @param rows The maximum number of rows in the wall. If rows is less than * or equal to zero OR rows is greater than 30, the number of rows will be assigned the value 30. * Otherwise the number of rows will be assigned the value of rows. */ public void setNumRows(Integer rows) { if (rows <= 0 || rows > 30) { numRows = 30; } else { numRows = rows; } }   private void drawRow() { Integer row = 0; while (row <= rowLength) { makeBrick(); startX = startX + 54; row++; } }   private void makeBrick() { brick = new Rectangle(); brick.makeVisible(); brick.changeSize(bWidth, bHeight); brick.setPosition(startX, startY); bricks.add(brick); }     /** * Draw the wall. The first brick will be positioned at the coordinates (10, 550). * The number of bricks in a row is specified by setRowLength(). The maximum number of rows * is specified by setNumRows(). If decrease is true, each subsequent row of bricks * contains one brick less than the previous row. If symmetric is true AND decrease is true then * the wall is pyramid shaped. If symmetric is false AND decrease is true then the wall is shaped * like a right angle triangle. */ public void draw() { eraseWall(); drawRow(); boolean decrease = false; boolean symmetric = false; }     public void eraseWall() { Canvas canvas = Canvas.getCanvas(); for (int i=0; !bricks.isEmpty(); i++) { canvas.erase(bricks.remove(0)); } }   }```

Many Thanks for the help in advance,

samjoyboy.
• November 15th, 2012, 11:17 AM
aussiemcgr
Re: I can't figure out why this isn't working!
A few questions, because I suspect you've confused yourself:
1. Is the variable rowLength supposed to be the number of bricks in each row, or the number of rows that need to be created? I ask because you are incrementing a variable named row, while incrementing the position of the brick along the X axis only.
2. Each row needs to have a different startY value, or each row will just be drawn over the previous. Where are you adjusting the Y coordinate to move down/up? Remember, X is East and West, and Y is North and South.
3. Where are you telling each row to have 8 bricks, and for it to create 4 rows?
• November 15th, 2012, 05:50 PM
samjoyboy
Re: I can't figure out why this isn't working!
Quote:

Originally Posted by aussiemcgr
A few questions, because I suspect you've confused yourself:
1. Is the variable rowLength supposed to be the number of bricks in each row, or the number of rows that need to be created? I ask because you are incrementing a variable named row, while incrementing the position of the brick along the X axis only.
2. Each row needs to have a different startY value, or each row will just be drawn over the previous. Where are you adjusting the Y coordinate to move down/up? Remember, X is East and West, and Y is North and South.
3. Where are you telling each row to have 8 bricks, and for it to create 4 rows?

1. rowLength is how many bricks are in each row - this is declared when I create a new brickwall in BlueJ. The make brick creates a brick then the startX moves position of the next brick after the previous however I need to create 8 bricks in each row consisting of 4 rows to get a brick wall.
2. each row needs to start below the previous which is why startY needs to add 16 after each row to go south of the previous row.
3. I tell it to do this from the setRowLength and setNumRows methods.

many thanks.
• November 16th, 2012, 03:04 PM
samjoyboy
Re: I can't figure out why this isn't working!
solved...

Code :

``` private void drawRow() { Integer row1 = 0; while (row1 < numRows) { for (Integer row = 0; row <= rowLength; row++) { makeBrick(); startX = startX + 54; } startY = startY + 16; startX = 10; row1++; } }```

thanks anyhow guys.