### CS51 - Spring 2010 - Lecture 17

• exercise 14.2.2
- provide a declaration for diamond, an array of four Lines needed to make the drawing. In your declaration, include an array construction.
- write the four assignment statements needed to create the diamond drawing and to associate these with the appropriate array entries. Assume the diamond has to just fit within a 200 by 200 pixel window.
- add additional lines to change the top two lines of the drawing red.

• Write a function that given an array of ints, returns the largest number in the array

public int largestNumber(int[] numbers){
int largest = numbers[0];

for( int number: numbers ){
if( number > largest ){
largest = number;
}
}
}

• show TextStat demo
- String member method: split
- public String[] split(String splitString);
- We're going to write the four supporting methods to make this class
- private String getLongestWord(String[] words)
- private String getShortestWord(String[] words)
- private int getNumberOfWords(String[] words)
- private int getNumberOfCharacters(String[] words)

• Show DrawingPanelWithShapeArray demo
- Note how we can move things around and different objects are "in front" of other objects
- Hard to get this behavior with recursion
- We'll do this using arrays:
- we'll construct an array with some maximum size, call it MAX_OBJECTS
- private DrawableInterface[] shapes = new DrawableInterface[MAX_OBJECTS];
- initially, the array will be empty
- how can we do this?
- keep an integer (int numShapes) that tells us how many things are in the array so far
- How do we add a new item?
- construct the shap
- figure out the shape from the menu and create a new shape
- figure out the color from the menu and set color
- how do we add it to the shapes array?
- remember, we're using numShapes to keep track of how many items are already in the array
- set shapes[numShapes] to the new object
- increment numShapes
- how do we delete an item?
- figure out which object we clicked on
- remove it from the canvas
- remove it from our shapes array
- let's look at each of these in more detail
- how do we find out which object we clicked on?
// returns the index into shapes of the object that contains point
// or -1 if none contain that point
public int getIndexOf(Location point)
- how do we deal with overlapping items, i.e. what if we click and two items contain the point?
- where are we adding more recent items?
- to the end of the array
- therefore, items towards the end of the array are more recent
- look at getIndexOf method in DrawingPanelWithShapeArray code
- start from the back not the front
- return the first one we find
- how do we remove something at a particular index from the shapes array?
- starting at that index, shift everything down
- set the last thing to null
- decrement numShapes
- look at removeEltWithIndex method
- How do we implement move?
- how do we normally move an object?
- onMousePress
- check if we clicked on the object
- set a boolean variable that we're dragging
- remember where the mouse was pressed
- onMouseDrag
- move the object the difference between where the mouse was previously and currently
- remember where the mouse was pressed
- how is this going to change?
- onMousePress
- iterate through all of the things in our array to see if any of them were clicked on
- rather than a boolean, we'll use a variable of type DrawableInterface to keep track of whether or not something is selected
- if null, then nothing was clicked on
- if non-null, then the variable has the object that was clicked on
- onMouseDrag
- doesn't change
- how does moving affect overlapping items?
- the challenge is that when we move something, we bring it to the front
- if we don't change our shapes array ordering, will it work properly?
- we're assuming things later on in the array are on top of those previous
- if we don't change the ordering, then this will not be true
- so, what do we need to do when we move an item?
- we need to move it to the end of the array!
- how?
- delete it using removeEltWithIndex
- add it back on to the end of the array
- look at selectShapeAt method
- How do we implement Recolor? (should be easy now)
- getIndexOf(point)
- recolor that objects

• Other misc. array things
- what happens here?
int[] numbers = new array[10];
int currentIndex = 0;
...
currentIndex = 10;
numbers[currentIndex]++;

** ArrayOutOfBounds exception
- what happens here?
FramedRect[] rects = new FramedRect[10];
rect[0].move(10, 10);

** null pointer exception
- we've just created an array of FramedRect variables
- as like any other FramedRect variable, their initial value is null until you assign something to them