/** Notifies all registered map change listeners about a change. */ protected void fireMapChanged() { MapChangedEvent event = null; // clone mapChangeListeners first, because otherwise we'll get // concurrent modification exceptions if a listener calls something // that add or removes listeners Iterable<MapChangeListener> mapChangeListenersClone = new Vector<MapChangeListener>(mapChangeListeners); for (MapChangeListener l : mapChangeListenersClone) { if (event == null) event = new MapChangedEvent(this); l.mapChanged(event); } }