chap4InterfacesAndPo..
Download
Report
Transcript chap4InterfacesAndPo..
Chapter 4 (Horstmann’s Book)
Interface Types and Polymorphism:
Graphics, Timer, Animation
Hwajung Lee
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.
public interface Icon
{
int getIconWidth();
int getIconHeight();
void paintIcon(Component c,
Graphics g,
int x,
int y);
}
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
Rectangle2D.Double constructed with
top left corner
width
height
g2.draw(new Rectangle2D.Double(x, y, width, height));
For Ellipse2D.Double, specify bounding box
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);
g2.drawString(text, x, y);
x, y are base point coordinates
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
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 = new
Comparator<Student>()
{
public int compare(Student student1, Student student2)
{
return student1.getName().compareTo(student2.getName());
}
};
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, ...)
Ch4/action1/ActionTest.java
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);
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);
}
};
}
Answer:
public static ActionListener createGreetingButtonListener(final String message)
{
return new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
textField.setText(message);
}
};
}
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
}
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.
Ch4/timer/TimerTester.java
Public class ShapeIcon implements Icon
{
Public void paintIcon(Component c, Graphics g, int x, int y)
{
Paint the shape
}
…
}
ShapeIcon icon = new ShapeIcon(…);
JLabel label = new JLabel(icon);
ActionListener listener = new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
move the shape
label.repaint();
}
};
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.
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; }
...
}
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
Ch4/animation/MoveableShape.java
Ch4/animation/ShapeIcon.java
Ch4/animation/AnimationTester.java
Ch4/animation/CarShape.java