Custom Events
in Java |
Prof. David Bernstein |
Computer Science Department |
bernstdh@jmu.edu |
ColorButton
that can be used to select
a Color
ColorEvent
that can be used to inform
objects of Color
changes
ColorListener
interface
ColorEvent
package gui; import java.awt.*; /** * An EventObject that can be used to inform listeners of a * Color change * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public class ColorEvent extends java.util.EventObject { private Color color; private String id; /** * Explicit Value Constructor * * @param source The source of the event * @param color The Color of interest * @param id The identifier for this ColorEvent */ public ColorEvent(Object source, Color color, String id) { super(source); this.color = color; this.id = id; } /** * Get the Color associated with this ColorEvent * * @return The Color */ public Color getColor() { return color; } /** * Get the ID associated with this ColorEvent * * @return The ID */ public String getID() { return id; } }
ColorListener
package gui; /* * Requirements of objects that want to be informed of ColorEvents * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public interface ColorListener extends java.util.EventListener { /** * Handle a colorChanged message * * @param event The ColorEvent that generated the message */ public abstract void colorChanged(ColorEvent event); }
ColorButton
package gui; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import java.util.*; /** * A GUI Component that can be used to select a Color * * A ColorButton displays the currently selected * Color. When clicked, a JColorChooser is displayed that * allows the user to select a new Color. * * Observers that want to be informed of changes in the color * should implement the ChangeListener interface (not the ActionListener * interface). * * Because the ColorEvent extends java.util.EventObject (i.e., is a * Swing event), this class uses the EventListenerList class to manage * listeners. If ColorEvent were an AWT event, it would use * AWTEventMulticaster instead. In that case, there would be an attribute * like: * * private ColorListener colorListener; * * the addColorListener() method would look something like: * * public void addColorListener(ColorListener listener) * { * // Add the listener to the existing multicast listener * colorListener = AWTEventMulticaster.add(colorListener, listener); * } * * and the firing code would look something like: * * if (colorListener != null) * { * colorListener.colorChaned(event); * } * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public class ColorButton extends JButton implements ActionListener { private Color color; private EventListenerList listenerList = new EventListenerList(); private static final Dimension MINIMUM_SIZE = new Dimension(80,40); private static final Dimension PREFERRED_SIZE = new Dimension(80,80); /** * Default Constructor (Constructs a BLACK ColorButton) */ public ColorButton() { this(Color.BLACK); } /** * Explicit Value Constructor * * @param color The starting color */ public ColorButton(Color color) { super(" "); setColor(color); // Listen to ActionEvents super.addActionListener(this); } /** * Add a ColorListener to this ColorButton * * Note: These listeners are informed of events only after the * dialog stops blocking. * * @param listener The ColorListener */ public void addColorListener(ColorListener listener) { listenerList.add(ColorListener.class, listener); } /** * Handle actionPerformed messages (required by ActionListener) * * @param event The relevant ActionEvent */ public void actionPerformed(ActionEvent event) { Color newColor; Object source; source = event.getSource(); if (this == source) { newColor = JColorChooser.showDialog( this, "Choose a color.", this.color); if (newColor != null) setColor(newColor); } fireColorEvent(); } /** * Notify all of the ColorListener objects */ protected void fireColorEvent() { ColorEvent ce; Object[] list; list = listenerList.getListenerList(); if ((list != null) && (list.length > 0)) { ce = new ColorEvent(this, color, getActionCommand()); for (int i=0; i<list.length; i++) { // The array contains ALL types of listeners, so check the class if (list[i] instanceof ColorListener) { ((ColorListener)list[i]).colorChanged(ce); } } } } /** * Get the current Color * * @return The Color */ public Color getColor() { return this.color; } /** * Render this ColorButton * * @param g The rendering engine to use */ public void paint(Graphics g) { Dimension d; int height, width, x, y; super.paint(g); d = getSize(); height = d.height / 2; width = d.width / 2; x = d.width/2 - width/2; y = d.height/2 - height/2; g.setColor(this.color); g.fillRect(x, y, width, height); g.drawRect(x, y, width, height); } /** * Remove a ColorListener * * @param listener The ColorListener */ public void removeColorListener(ColorListener listener) { listenerList.remove(ColorListener.class, listener); } /** * Set the current Color * * @param The Color */ public void setColor(Color color) { if (color != null) this.color = color; } }
import java.awt.*; import javax.swing.*; import gui.ColorButton; import gui.ColorEvent; import gui.ColorListener; /** * A driver that illustrates the use of the ColorButton class * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public class ColorButtonDriver implements ColorListener { /** * Handle a colorChanged message (requried by ColorListener) * * @param event The ColorEvent that generated the message */ public void colorChanged(ColorEvent event) { System.out.println(event.getID() + "\t"+ event.getColor()); } /** * The entry point */ public static void main(String[] args) { ColorButton button; ColorButtonDriver cbd; Container contentPane; JFrame frame; frame = new JFrame(); contentPane = frame.getContentPane(); contentPane.setLayout(new FlowLayout()); cbd = new ColorButtonDriver(); button = new ColorButton(Color.RED); button.setActionCommand("Foreground"); button.addColorListener(cbd); contentPane.add(button); button = new ColorButton(Color.BLUE); button.setActionCommand("Background"); button.addColorListener(cbd); contentPane.add(button); frame.setSize(400,200); frame.setVisible(true); } }