Even even more on being classy Aaron Bloomfield CS 101-E Chapter 4+ 1 Consider this sequence of events… 2 What happened? Java didn’t “repaint” the rectangles when necessary Java only painted the rectangle once You can tell Java to repaint it whenever necessary This is beyond the scope of this class, though! 3 Seeing double import java.awt.*; public class SeeingDouble { public static void main(String[] args) { ColoredRectangle r = new ColoredRectangle(); System.out.println("Enter when ready"); Scanner stdin = new Scanner (System.in); stdin.nextLine(); r.paint(); r.setY(50); r.setColor(Color.RED); r.paint(); } } 4 Seeing double When paint() was called, the previous rectangle was not erased This is a simpler way of implementing this Perhaps clear and repaint everything when a rectangle paint() is called 5 Code from last class // Purpose: Create two windows containing colored rectangles. import java.util.*; public class BoxFun { //main(): application entry point public static void main (String[] args) { ColoredRectangle r1 = new ColoredRectangle(); ColoredRectangle r2 = new ColoredRectangle(); System.out.println("Enter when ready"); Scanner stdin = new Scanner (System.in); stdin.nextLine(); r1.paint(); r2.paint(); } } // draw the window associated with r1 // draw the window associated with r2 6 public class ColoredRectangle { // instance variables for holding object attributes private int width; private int height; private JFrame window; private int x; private int y; private Color color; // ColoredRectangle(): default constructor public ColoredRectangle() { color = Color.BLUE; width = 40; x = 80; height = 20; y = 90; window = new JFrame("Box Fun"); window.setSize(200, 200); window.setVisible(true); } // paint(): display the rectangle in its window public void paint() { Graphics g = window.getGraphics(); g.setColor(color); g.fillRect(x, y, width, height); } } 7 r public class public void paint(){ { ColoredRectangle Graphicsint g =width; private window.getGraphics(); private int x, y; g.setColor(color); private int height; g.fillRect private int (x, y; y, width,JFrame height); private window; } private Color color; ColoredRectangle r = new ColoredRectangle(); ColorRectangle - width = 40 0 - height = 20 0 - x = 80 0 - y = 90 0 - color = - window = Color - color = - ... + brighter() : Color + ... + paint() : void public ColoredRectangle() { color = Color.BLUE; width = 40; JFrame height = 20; - width = 200 y = 90; - height = 200 x = 80; - title = window = new - grafix = JFrame - ... ("Box Fun"); + setVisible (boolean status) : void window.setSize + getGraphics () : Graphics (200, 200); + setSize (int w, int h) : void window.setVisible +… (true); g } String - text = “Box Fun” - ... + length() : int + ... Graphics -… + fillRect() : void + setColor(Color) :8void + ... The Vector class In java.util Must put “import java.util.*;” in the java file Probably the most useful class in the library (in my opinion) A Vector is a collection of “things” (objects) It has nothing to do with the geometric vector 9 Vector methods Constructor: Vector() Adding objects: add (Object o); Removing objects: remove (int which) Number of elements: size() Element access: elementAt() Removing all elements: clear() 10 Vector code example Vector v = new Vector(); System.out.println (v.size() + " " + v); 0 [] v.add ("first"); System.out.println (v.size() + " " + v); 1 [first] v.add ("second"); v.add ("third"); System.out.println (v.size() + " " + v); 3 [first, second, third] String s = (String) v.elementAt (2); System.out.println (s); third String t = (String) v.elementAt (3); System.out.println (t); (Exception) v.remove (1); System.out.println (v.size() + " " + v); 2 [first, third] v.clear(); System.out.println (v.size() + " " + v); 0 [] 11 What we wish computers could do 12 The usefulness of Vectors You can any object to a Vector Strings, ColoredRectanges, JFrames, etc. They are not the most efficient for some tasks Searching, in particular 13 About that exception… The exact exception was: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 >= 3 at java.util.Vector.elementAt(Vector.java:431) at VectorTest.main(VectorTest.java:15) Where the problem occured 14 A Vector of ints Consider the following code: Vector v = new Vector(); v.add (1); Causes a compile-time error Most of the time - see disclaimer later C:\Documents and Settings\Aaron\My Documents\JCreator\VectorTest\VectorTest.java:7: cannot resolve symbol symbol : method add (int) location: class java.util.Vector v.add (1); 15 What happened? The Vector add() method: boolean add(Object o) Primitive types are not objects! Solution: use wrapper classes! 16 More on wrapper classes A wrapper class allows a primitive type to act as an object Each primitive type has a wrapper class: Boolean Character Byte Short Integer Long Float Double Note that char and int don’t have the exact same name as their wrapper classes 17 Vector code example Vector v = new Vector(); System.out.println (v.size() + " " + v); 0 [] v.add (new Integer(1)); System.out.println (v.size() + " " + v); 1 [1] v.add (new Integer(2)); v.add (new Integer(3)); System.out.println (v.size() + " " + v); 3 [1, 2, 3] Integer s = (Integer) v.elementAt (2); System.out.println (s); 3 Integer t = (Integer) v.elementAt (3); System.out.println (t); (Exception) v.remove (1); System.out.println (v.size() + " " + v); 2 [1, 3] v.clear(); System.out.println (v.size() + " " + v); 0 [] 18 Even more on wrapper classes They have variables: useful class (i.e. static) Integer.MAX_VALUE Double.MIN_VALUE They have useful methods: String s = “3.14159”; double d = Double.parseDouble (s); 19 A disclaimer Java 1.5 (which we are not using) has a new feature called “autoboxing/unboxing” This will automatically convert primitive types to their wrapper classes (and back) 20 An optical illusion 21 Design an air conditioner representation Context - Consumer Repair person Sales person Consumer Behaviors Attributes 22 Design an air conditioner representation Context - Consumer Behaviors Turn on Turn off Get temperature and fan setting Set temperature and fan setting Build – construction Debug Attributes 23 Design an air conditioner representation Context - Consumer Behaviors Turn on Turn off Get temperature and fan setting Set temperature and fan setting Build – construction Debug – to stringing Attributes 24 Design an air conditioner representation Context - Consumer Behaviors Turn on Turn off Get temperature and fan setting Set temperature and fan setting – mutation Build – construction Debug – to stringing Attributes 25 Design an air conditioner representation Context - Consumer Behaviors Turn on Turn off Get temperature and fan setting – accessing Set temperature and fan setting – mutation Build – construction Debug – to stringing Attributes 26 Design an air conditioner representation Context - Consumer Behaviors Turn on – mutation Turn off – mutation Get temperature and fan setting – accessing Set temperature and fan setting – mutation Build – construction Debug – to stringing Attributes 27 Design an air conditioner representation Context - Consumer Behaviors Turn on – mutation Turn off – mutation Get temperature and fan setting – accessing Set temperature and fan setting – mutation Build – construction Debug – to stringing Attributes 28 Design an air conditioner representation Context - Consumer Behaviors Turn on Turn off Get temperature and fan setting Set temperature and fan setting Build -- construction Debug Attributes Power setting Fan setting Temperature setting 29 Design an air conditioner representation Context - Consumer Behaviors Turn on Turn off Get temperature and fan setting Set temperature and fan setting Build -- construction Debug Attributes Power setting Fan setting Temperature setting – integer 30 Design an air conditioner representation Context - Consumer Behaviors Turn on Turn off Get temperature and fan setting Set temperature and fan setting Build -- construction Debug Attributes Power setting – binary Fan setting – binary Temperature setting – integer 31 Ugh… 32 Design an air conditioner representation // Represent an air conditioner – from consumer view point public class AirConditioner { // instance variables // constructors // methods } Source AirConditioner.java 33 Static variables and constants // shared resource for all AirConditioner objects static public final int OFF = 0; Static public final int ON = 1; static public final int LOW = 0; Static public final int HIGH = 1; static public final int DEFAULT_TEMP = 72; Every object in the class has access to the same static variables and constants A change to a static variable is visible to all of the objects in the class Examples StaticDemo.java and DemoStatic.java 34 Instance variables // individual object attributes int powerSetting; int fanSetting; int temperatureSetting; Instance variables are always initialized as soon the object comes into existence If no value is specified 0 used for numeric variables false used for logical variables null used for object variables Examples InitializeDemo.java 35 Constructors // AirConditioner(): default constructor public AirConditioner() { this.powerSetting = AirConditioner.OFF; this.fanSetting = AirConditioner.LOW; this.temperatureSetting = AirConditioner.DEFAULT_TEMP; } // AirConditioner(): specific constructor public AirConditioner(int myPower, int myFan, int myTemp) { this.powerSetting = myPower; this.fanSetting = myFan; this.temperatureSetting = myTemp; } Example AirConditionerConstruction.java 36 Simple mutators // turnOn(): set the power setting to on public void turnOn() { this.powerSetting = AirConditioner.ON; } // turnOff(): set the power setting to off public void turnOff() { this.powerSetting = AirConditioner.OFF; } Example TurnDemo.java 37 Simple accessors // getPowerStatus(): report the power setting public int getPowerStatus() { return this.powerSetting; } // getFanStatus(): report the fan setting public int getFanStatus() { return this.fanSetting; } // getTemperatureStatus(): report the temperature setting public int getTemperatureStatus () { return this.temperatureSetting; } Example AirConditionerAccessors.java 38 Parametric mutators // setPower(): set the power setting as indicated public void setPower(int desiredSetting) { this.powerSetting = desiredSetting; } // setFan(): set the fan setting as indicated public void setFan(int desiredSetting) { this.fanSetting = desiredSetting; } // setTemperature(): set the temperature setting as indicated public void setTemperature(int desiredSetting) { this.temperatureSetting = desiredSetting; } Example AirConditionerSetMutation.java 39 Facilitator toString() // toString(): produce a String representation of the object public String toString() { String result = "[ power: " + this.powerSetting + ", fan: " + this.fanSetting + ", temperature: " + this.temperatureSetting + " ] "; return result; } 40 Sneak peek facilitator toString() public String toString() { String result = "[ power: " ; if ( this.powerSetting == AirConditioner.OFF ) { result = result + "OFF"; } else { result = result + "ON " ; } result = result + ", fan: "; if ( this.fanSetting == AirConditioner.LOW ) { result = result + "LOW "; } else { result = result + "HIGH"; } result = result + ", temperature: " + this.temperatureSetting + " ]"; return result; } 41 What computers were made for NASA’s WorldWind See http://learn.arc.nasa.gov/worldwind/ 42