1 / 27

ITEC324 Principle of CS III

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).

bellterri
Download Presentation

ITEC324 Principle of CS III

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 4 (Horstmann’s Book) Interface Types and Polymorphism: Graphics, Timer, Animation Hwajung Lee ITEC324 Principle of CS III

  2. 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.

  3. The Icon Interface Type • public interface Icon{ int getIconWidth(); int getIconHeight(); void paintIcon(Component c, Graphics g, int x, int y);}

  4. 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

  5. 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

  6. Shape Interface Type & Polymorphism (3) Drawing Ellipses

  7. 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);

  8. Shape Interface Type & Polymorphism (5) Relationship btw Shape Interface and Classes

  9. Shape Interface Type & Polymorphism (6) Drawing Text • g2.drawString(text, x, y); • x, y are base point coordinates

  10. 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

  11. 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()); }};

  12. 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, ...)

  13. User Interface Action (1) • Ch4/action1/ActionTest.java

  14. 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);

  15. 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); } }; }

  16. User Interface Action (4) • Answer: public static ActionListener createGreetingButtonListener(final String message) { return new ActionListener() { public void actionPerformed(ActionEvent event) { textField.setText(message); } }; }

  17. 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 }

  18. 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.

  19. Timers (2) • Ch4/timer/TimerTester.java

  20. Designing an Interface Type (1) Public class ShapeIcon implements Icon { Public void paintIcon(Component c, Graphics g, int x, int y) { Paint the shape } … }

  21. 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(); } };

  22. 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.

  23. Designing an Interface Type (4) CRC Card for the MoveableShape Interface Type

  24. 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; }   . . .}

  25. 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

  26. Designing an Interface Type (7)Implementing the Animation

  27. Designing an Interface Type (8)Implementing the Animation • Ch4/animation/MoveableShape.java • Ch4/animation/ShapeIcon.java • Ch4/animation/AnimationTester.java • Ch4/animation/CarShape.java

More Related