Re: Images and OO
To: comp.lang.java.gui
Andrew wrote:
Hello,
I am writing a very simple programs which displays a different coloured
target depending on what colour has been selected (using a combo box).
I have an abstract class called Target and three classes called GreenTarget,
RedTarget and YellowTarget which all extend Target.
Each subclass has a method called getColourIndex which returns an integer
relating to the correct coloured target to load in the images array.
To select the colour and return the correct subclass, I have used the
following code.
[snip code]
How could this code be better? How can I rearrange the code so that I am not
asking for raw data (the image indexes) from the subclasses?
[snip]
It seems to me that you've used polymorphism in the wrong place.
What happens when your Target can also be Small, Medium, or Large? And
then Square, Triangle, or Circle?
You'd have to have SmallGreenCircleTarget, LargeGreenCircleTarget,
etc.... That would be 81 difference classes! Yikes.
In this case, it seems likely that what you really want is something
like this:
import java.awt.*;
import java.awt.event.*;
import java.util.Map;
import java.util.Collection;
import java.util.HashMap;
public class Test extends Panel implements ActionListener {
Choice choice = new Choice();
Button display = new Button("Display");
Map<String, Image> images = new HashMap<String, Image>();
public class ImageChoice {
String name;
Image image;
}
Test(Collection<ImageChoice> imageChoices) {
for (ImageChoice imageChoice : imageChoices) {
images.put(imageChoice.name, imageChoice.image);
choice.add(imageChoice.name);
}
add(choice);
add(display);
display.addActionListener(this);
}
public void actionPerformed(ActionEvent evt) {
repaint();
}
public void paint(Graphics g) {
g.drawImage(images.get(choice.getSelectedItem()),0,0,this);
}
}
This still isn't entirely Object Oriented, but a full blown OO approach
might be too heavyweight for what you're trying to do.
If you want to go the Object Oriented approach, I suggest looking into
JSpinner, and using Swing instead of AWT. Actually, I suggest Swing
over AWT anyway.
Hope this helps.
Daniel.
---
* Synchronet * The Whitehouse BBS --- whitehouse.hulds.com --- check it out free usenet!
--- Synchronet 3.15a-Win32 NewsLink 1.92
Time Warp of the Future BBS - telnet://time.synchro.net:24