Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 4 (Horstmann’s Book) Interface Types and Polymorphism: Graphics, Timer, Animation Hwajung Lee.

Similar presentations


Presentation on theme: "Chapter 4 (Horstmann’s Book) Interface Types and Polymorphism: Graphics, Timer, Animation Hwajung Lee."— Presentation transcript:

1 Chapter 4 (Horstmann’s Book) Interface Types and Polymorphism: Graphics, Timer, Animation Hwajung Lee

2  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  public interface Icon { int getIconWidth(); int getIconHeight(); void paintIcon(Component c, Graphics g, int x, int y); }

4  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); 

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

7  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

9  g2.drawString(text, x, y);  x, y are base point coordinates

10  Fill interior of shape g2.fill(shape);  Set color for fills or strokes: g2.setColor(Color.red);  Program that draws car Ch4/icon3/CarIcon.java Ch4/icon3/CarIcon.java

11  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 comp = new Comparator () { public int compare(Student student1, Student student2) { return student1.getName().compareTo(student2.getName()); } };

12  Anonymous class is commonly used in factory methods: public class Student { public static Comparator comparatorByName() { return new Comparator () { public int compare(Student s1, Student s2) {... } }; } }  Neat arrangement if multiple comparators make sense (by name, by grade,...)

13  Ch4/action1/ActionTest.java Ch4/action1/ActionTest.java

14  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  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  Answer: public static ActionListener createGreetingButtonListener(final String message) { return new ActionListener() { public void actionPerformed(ActionEvent event) { textField.setText(message); } }; }

17 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  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 sec Timer 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  Ch4/timer/TimerTester.java Ch4/timer/TimerTester.java

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

21 ShapeIcon icon = new ShapeIcon( … ); JLabel label = new JLabel(icon); ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { move the shape label.repaint(); } };

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

24  Name the methods to conform to standard library public interface MoveableShape { void draw(Graphics2D g2); void translate(int dx, int dy); }  CarShape class implements MoveableShape public class CarShape implements MoveableShape { public void translate(int dx, int dy) { x += dx; y += dy; }... }

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

27  Ch4/animation/MoveableShape.java Ch4/animation/MoveableShape.java  Ch4/animation/ShapeIcon.java Ch4/animation/ShapeIcon.java  Ch4/animation/AnimationTester.java Ch4/animation/AnimationTester.java  Ch4/animation/CarShape.java Ch4/animation/CarShape.java


Download ppt "Chapter 4 (Horstmann’s Book) Interface Types and Polymorphism: Graphics, Timer, Animation Hwajung Lee."

Similar presentations


Ads by Google