/* * @(#)ColorComponent.java * * $Date: 2014-03-13 01:15:48 -0700 (Thu, 13 Mar 2014) $ * * Copyright (c) 2011 by Jeremy Wood. * All rights reserved. * * The copyright of this software is owned by Jeremy Wood. * You may not use, copy or modify this software, except in * accordance with the license agreement you entered into with * Jeremy Wood. For details see accompanying license terms. * * This software is probably, but not necessarily, discussed here: * https://javagraphics.java.net/ * * That site should also contain the most recent official version * of this software. (See the SVN repository for more details.) */ package com.bric.swing; import java.awt.Color; import java.util.Vector; import javax.swing.JComponent; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** This is an abstract <code>JComponent</code> that stores * and somehow presents a color. When <code>setColor()</code> * is called this component's <code>ChangeListeners</code> are * notified. * <P>The initial color is black. */ public abstract class ColorComponent extends JComponent { private static final long serialVersionUID = 1L; protected Color color = Color.black; Vector<ChangeListener> changeListeners = new Vector<ChangeListener>(); /** Add a <code>ChangeListener</code> to be notified when * <code>setColor()</code> is called. */ public void addChangeListener(ChangeListener l) { if(changeListeners.contains(l)) return; changeListeners.add(l); } /** Remove a <code>ChangeListener</code>. * */ public void removeChangeListener(ChangeListener l) { changeListeners.remove(l); } /** Returns the current color. * * @return the current color. */ public Color getColor() { return color; } protected void fireChangeListeners() { for(int a = 0; a<changeListeners.size(); a++) { ChangeListener l = changeListeners.get(a); try { l.stateChanged(new ChangeEvent(this)); } catch(RuntimeException e) { e.printStackTrace(); } } } /** Defines the current color. * * @param c the new color. * @return <code>true</code> if a change occurred. Or <code>false</code> * if the argument was already the current color and no listeners * were notified. */ public boolean setColor(Color c) { if(c==null) throw new NullPointerException(); if(color!=null && c!=null && c.equals(color)) return false; Color oldColor = null; color = c; fireChangeListeners(); firePropertyChange("color", oldColor, color); return true; } public void bind(final ColorComponent slave) { slave.setColor(getColor()); ChangeListener changeListener = new ChangeListener() { public void stateChanged(ChangeEvent e) { ColorComponent c = (ColorComponent)e.getSource(); if(c==ColorComponent.this) { slave.setColor( getColor() ); } else { setColor( slave.getColor() ); } } }; addChangeListener(changeListener); slave.addChangeListener(changeListener); } }