270 likes | 280 Views
Chapter 4 (Horstmann’s Book) Interface Types and Polymorphism : Graphics, Timer, Animation Hwajung Lee. ITEC324 Principle of CS III. Why?. Interfaces A class defines a set of operations (the interface) and statements (implementation).
E N D
Chapter 4 (Horstmann’s Book) Interface Types and Polymorphism: Graphics, Timer, Animation Hwajung Lee ITEC324 Principle of CS III
Why? • Interfaces • A class defines a set of operations (the interface) and statements (implementation). • Separating the interface concept from that of a class can help in the development of “generic” reusable code. • Polymorphism • Polymorphism: Ability to select different methods according to actual object type. • Multiple classes can implement the same interface type so that it is possible to operate on a mixture of objects from any of these classes.
The Icon Interface Type • public interface Icon{ int getIconWidth(); int getIconHeight(); void paintIcon(Component c, Graphics g, int x, int y);}
Shape Interface Type & Polymorphism (1) • paintIcon method receives graphics context of type Graphics • Actually a Graphics2D object in modern Java versions public void paintIcon(Component c, Graphics g, int x, int y){ Graphics2D g2 = (Graphics2D) g; . . .} • Can draw any object that implements Shape interface Shape s = . . .;g2.draw(s); • http://java.sun.com/j2se/1.3/docs/api/java/awt/Shape.html
Shape Interface Type & Polymorphism (2) Drawing Rectangles and Ellipses • Rectangle2D.Double constructed with • top left corner • width • height • g2.draw(new Rectangle2D.Double(x, y, width, height)); • For Ellipse2D.Double, specify bounding box
Shape Interface Type & Polymorphism (4) Drawing Line Segments • Point2D.Double is a point in the plane • Line2D.Double joins to points Point2D.Double start = new Point2D.Double(x1, y1);Point2D.Double end = new Point2D.Double(x2, y2);Shape segment = new Line2D.Double(start, end);g2.draw(segment);
Shape Interface Type & Polymorphism (5) Relationship btw Shape Interface and Classes
Shape Interface Type & Polymorphism (6) Drawing Text • g2.drawString(text, x, y); • x, y are base point coordinates
Shape Interface Type & Polymorphism (7) Filling Shapes • Fill interior of shapeg2.fill(shape); • Set color for fills or strokes:g2.setColor(Color.red); • Program that draws carCh4/icon3/CarIcon.java
Anonymous Classes • No need to name objects that are used only once. Collections.sort(students,new StudentComparatorByName()); • No need to name classes that are used only once. Comparator<Student> comp = newComparator<Student>() { public int compare(Student student1, Student student2) { return student1.getName().compareTo(student2.getName()); }};
Factory Methods • Anonymous class is commonly used in factory methods: public class Student { public static Comparator<Student> comparatorByName() { return new Comparator<Student>() { public int compare(Student s1, Student s2) { . . . } }; }} • Neat arrangement if multiple comparators make sense(by name, by grade, ...)
User Interface Action (1) • Ch4/action1/ActionTest.java
User Interface Action (2)Accessing Variables from Enclosing Scope • Method of Inner classes can access variables that are visible in the enclosing scope e.g. actionPerformed method accesses the textField variable of the enclosing main method • If an inner class accesses a local variable from an enclosing scope, the variable must be declared as final. final JTextField textField = new TextField(Field_WIDTH);
User Interface Action (3) • To construct multiple objects of the same anonymous class, you must instantiate the anonymous class in a helper method (a factory method) and then call it multiple times. Note: you should declare parameters final • Debug the following Code public static ActionListener createGreetingButtonListener(String message) { return new ActionListener() { public void actionPerformed(ActionEvent event) { textField.setText(message); } }; }
User Interface Action (4) • Answer: public static ActionListener createGreetingButtonListener(final String message) { return new ActionListener() { public void actionPerformed(ActionEvent event) { textField.setText(message); } }; }
User Interface Action (5) Public class ActionTest { Public static void main(String[] args) { … textField = new JTextField(FIELD_SIZE); helloButton.addActionListener( creatGreetingButtonListener(“Hello, World !”)); goodbyeButton. addActionListener( creatGreetingButtonListener(“Goodbye, World !”)); … } // the helper method in the previous slide places here }
Timers (1) • Javax.swing package • Timer generates a sequence of action events spaced apart at equal time interval, and notifies a designated action listener. ActionListener listener = ...;final int DELAY = 1000; // 1000 millisec = 1 secTimer t = new Timer(DELAY, listener);t.start(); The start method returns immediately. A new thread of execution is started that issues action events in the specified frequency.
Timers (2) • Ch4/timer/TimerTester.java
Designing an Interface Type (1) Public class ShapeIcon implements Icon { Public void paintIcon(Component c, Graphics g, int x, int y) { Paint the shape } … }
Designing an Interface Type (2) ShapeIcon icon = new ShapeIcon(…); JLabel label = new JLabel(icon); ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { move the shape label.repaint(); } };
Designing an Interface Type (3) • Use timer to • Move car shapes • Draw car with CarShape • Two responsibilities: • Draw shape • Move shape • Define new interface type MoveableShape : we can decoupled the animation from the car shape.
Designing an Interface Type (4) CRC Card for the MoveableShape Interface Type
Designing an Interface Type (5) • Name the methods to conform to standard library public interface MoveableShape{ void draw(Graphics2D g2); void translate(int dx, int dy);} • CarShape class implements MoveableShapepublic class CarShape implements MoveableShape{ public void translate(int dx, int dy) { x += dx; y += dy; } . . .}
Designing an Interface Type (6)Implementing the Animation • Label contains icon that draws shape • Timer action moves shape, calls repaint on label • Label needs Icon, we have MoveableShape • Supply ShapeIcon adapter class • ShapeIcon.paintIcon calls MoveableShape.draw
Designing an Interface Type (8)Implementing the Animation • Ch4/animation/MoveableShape.java • Ch4/animation/ShapeIcon.java • Ch4/animation/AnimationTester.java • Ch4/animation/CarShape.java