package net.sf.openrocket.aerodynamics;
import java.util.ArrayList;
+import java.util.EventListener;
+import java.util.EventObject;
import java.util.List;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
import net.sf.openrocket.models.atmosphere.AtmosphericConditions;
import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.Monitorable;
+import net.sf.openrocket.util.StateChangeListener;
import net.sf.openrocket.util.UniqueID;
/**
*/
public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
- private List<ChangeListener> listenerList = new ArrayList<ChangeListener>();
- private ChangeEvent event = new ChangeEvent(this);
+ private List<EventListener> listenerList = new ArrayList<EventListener>();
+ private EventObject event = new EventObject(this);
/** Reference length used in calculations. */
public FlightConditions clone() {
try {
FlightConditions cond = (FlightConditions) super.clone();
- cond.listenerList = new ArrayList<ChangeListener>();
- cond.event = new ChangeEvent(cond);
+ cond.listenerList = new ArrayList<EventListener>();
+ cond.event = new EventObject(cond);
cond.atmosphericConditions = atmosphericConditions.clone();
return cond;
} catch (CloneNotSupportedException e) {
@Override
- public void addChangeListener(ChangeListener listener) {
+ public void addChangeListener(EventListener listener) {
listenerList.add(0, listener);
}
@Override
- public void removeChangeListener(ChangeListener listener) {
+ public void removeChangeListener(EventListener listener) {
listenerList.remove(listener);
}
protected void fireChangeEvent() {
modID = UniqueID.next();
- ChangeListener[] listeners = listenerList.toArray(new ChangeListener[0]);
- for (ChangeListener l : listeners) {
- l.stateChanged(event);
+ // Copy the list before iterating to prevent concurrent modification exceptions.
+ EventListener[] listeners = listenerList.toArray(new EventListener[0]);
+ for (EventListener l : listeners) {
+ if ( l instanceof StateChangeListener ) {
+ ((StateChangeListener)l).stateChanged(event);
+ }
}
}
}
package net.sf.openrocket.document;
+import java.util.EventListener;
+import java.util.EventObject;
import java.util.List;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
import net.sf.openrocket.aerodynamics.AerodynamicCalculator;
import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
import net.sf.openrocket.aerodynamics.WarningSet;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.SafetyMutex;
+import net.sf.openrocket.util.StateChangeListener;
/**
* A class defining a simulation, its conditions and simulated data.
/** Listeners for this object */
- private List<ChangeListener> listeners = new ArrayList<ChangeListener>();
+ private List<EventListener> listeners = new ArrayList<EventListener>();
/** The conditions actually used in the previous simulation, or null */
copy.status = Status.NOT_SIMULATED;
copy.options = this.options.clone();
copy.simulationListeners = this.simulationListeners.clone();
- copy.listeners = new ArrayList<ChangeListener>();
+ copy.listeners = new ArrayList<EventListener>();
copy.simulatedConditions = null;
copy.simulatedMotors = null;
copy.simulatedData = null;
@Override
- public void addChangeListener(ChangeListener listener) {
+ public void addChangeListener(EventListener listener) {
mutex.verify();
listeners.add(listener);
}
@Override
- public void removeChangeListener(ChangeListener listener) {
+ public void removeChangeListener(EventListener listener) {
mutex.verify();
listeners.remove(listener);
}
protected void fireChangeEvent() {
- ChangeListener[] ls = listeners.toArray(new ChangeListener[0]);
- ChangeEvent e = new ChangeEvent(this);
- for (ChangeListener l : ls) {
- l.stateChanged(e);
+ EventObject e = new EventObject(this);
+ // Copy the list before iterating to prevent concurrent modification exceptions.
+ EventListener[] ls = listeners.toArray(new EventListener[0]);
+ for (EventListener l : ls) {
+ if ( l instanceof StateChangeListener ) {
+ ((StateChangeListener)l).stateChanged(e);
+ }
}
}
- private class ConditionListener implements ChangeListener {
+ private class ConditionListener implements StateChangeListener {
private Status oldStatus = null;
@Override
- public void stateChanged(ChangeEvent e) {
+ public void stateChanged(EventObject e) {
if (getStatus() != oldStatus) {
oldStatus = getStatus();
fireChangeEvent();
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.EventListener;
+import java.util.EventObject;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BoundedRangeModel;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
-import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.MemoryManagement;
import net.sf.openrocket.util.Reflection;
+import net.sf.openrocket.util.StateChangeListener;
/**
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
-public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable {
+public class DoubleModel implements StateChangeListener, ChangeSource, Invalidatable {
private static final LogHelper log = Application.getLogger();
//////////// JSlider model ////////////
- private class ValueSliderModel implements BoundedRangeModel, ChangeListener, Invalidatable {
+ private class ValueSliderModel implements BoundedRangeModel, StateChangeListener, Invalidatable {
private static final int MAX = 1000;
/*
}
@Override
- public void stateChanged(ChangeEvent e) {
+ public void stateChanged(EventObject e) {
// Min or max range has changed.
// Fire if not already firing
if (firing == 0)
//////////// Action model ////////////
- private class AutomaticActionModel extends AbstractAction implements ChangeListener, Invalidatable {
+ private class AutomaticActionModel extends AbstractAction implements StateChangeListener, Invalidatable {
private boolean oldValue = false;
public AutomaticActionModel() {
// If the value has changed, generate an event to the listeners
@Override
- public void stateChanged(ChangeEvent e) {
+ public void stateChanged(EventObject e) {
boolean newValue = isAutomatic();
if (oldValue == newValue)
return;
private final Method getAutoMethod;
private final Method setAutoMethod;
- private final ArrayList<ChangeListener> listeners = new ArrayList<ChangeListener>();
+ private final ArrayList<EventListener> listeners = new ArrayList<EventListener>();
private final UnitGroup units;
private Unit currentUnit;
* @param l Listener to add.
*/
@Override
- public void addChangeListener(ChangeListener l) {
+ public void addChangeListener(EventListener l) {
checkState(true);
if (listeners.isEmpty()) {
* @param l Listener to remove.
*/
@Override
- public void removeChangeListener(ChangeListener l) {
+ public void removeChangeListener(EventListener l) {
checkState(false);
listeners.remove(l);
protected void fireStateChanged() {
checkState(true);
- Object[] l = listeners.toArray();
- ChangeEvent event = new ChangeEvent(this);
+ EventObject event = new EventObject(this);
firing++;
- for (int i = 0; i < l.length; i++)
- ((ChangeListener) l[i]).stateChanged(event);
+ // Copy the list before iterating to prevent concurrent modification exceptions.
+ EventListener[] ls = listeners.toArray(new EventListener[0]);
+ for (EventListener l : ls) {
+ if ( l instanceof StateChangeListener ) {
+ ((StateChangeListener)l).stateChanged(event);
+ }
+ }
firing--;
}
* it has, updates lastValue and generates ChangeEvents for all listeners of the model.
*/
@Override
- public void stateChanged(ChangeEvent e) {
+ public void stateChanged(EventObject e) {
checkState(true);
double v = getValue();
package net.sf.openrocket.gui.adaptors;
+import java.util.EventObject;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ComboBoxModel;
import javax.swing.SwingUtilities;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.startup.Application;
+import net.sf.openrocket.util.StateChangeListener;
-public class MotorConfigurationModel implements ComboBoxModel, ChangeListener {
+public class MotorConfigurationModel implements ComboBoxModel, StateChangeListener {
private static final Translator trans = Application.getTranslator();
private static final String EDIT = trans.get("MotorCfgModel.Editcfg");
@Override
- public void stateChanged(ChangeEvent e) {
+ public void stateChanged(EventObject e) {
if (e instanceof ComponentChangeEvent) {
// Ignore unnecessary changes
if (!((ComponentChangeEvent)e).isMotorChange())
import java.awt.Color;
import java.awt.Dimension;
+import java.util.EventListener;
+import java.util.EventObject;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JPanel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
import net.sf.openrocket.util.Prefs;
+import net.sf.openrocket.util.StateChangeListener;
public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure {
protected int borderPixelsWidth = DEFAULT_BORDER_PIXELS_WIDTH;
protected int borderPixelsHeight = DEFAULT_BORDER_PIXELS_HEIGHT;
- protected final List<ChangeListener> listeners = new LinkedList<ChangeListener>();
+ protected final List<EventListener> listeners = new LinkedList<EventListener>();
public AbstractScaleFigure() {
@Override
- public void addChangeListener(ChangeListener listener) {
+ public void addChangeListener(EventListener listener) {
listeners.add(0, listener);
}
@Override
- public void removeChangeListener(ChangeListener listener) {
+ public void removeChangeListener(EventListener listener) {
listeners.remove(listener);
}
- private ChangeEvent changeEvent = null;
+ private EventObject changeEvent = null;
protected void fireChangeEvent() {
- ChangeListener[] list = listeners.toArray(new ChangeListener[0]);
- for (ChangeListener l : list) {
- if (changeEvent == null)
- changeEvent = new ChangeEvent(this);
- l.stateChanged(changeEvent);
+ if (changeEvent == null)
+ changeEvent = new EventObject(this);
+ // Copy the list before iterating to prevent concurrent modification exceptions.
+ EventListener[] list = listeners.toArray(new EventListener[0]);
+ for (EventListener l : list) {
+ if ( l instanceof StateChangeListener ) {
+ ((StateChangeListener)l).stateChanged(changeEvent);
+ }
}
}
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.EventListener;
+import java.util.EventObject;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import javax.swing.JToggleButton;
import javax.swing.JViewport;
import javax.swing.SwingUtilities;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.Prefs;
+import net.sf.openrocket.util.StateChangeListener;
/**
* A JPanel that contains a RocketFigure and buttons to manipulate the figure.
private SimulationWorker backgroundSimulationWorker = null;
- private List<ChangeListener> listeners = new ArrayList<ChangeListener>();
+ private List<EventListener> listeners = new ArrayList<EventListener>();
/**
createPanel();
- configuration.addChangeListener(new ChangeListener() {
+ configuration.addChangeListener(new StateChangeListener() {
@Override
- public void stateChanged(ChangeEvent e) {
+ public void stateChanged(EventObject e) {
System.out.println("Configuration changed, calling updateFigure");
updateExtras();
figure.updateFigure();
@Override
- public void addChangeListener(ChangeListener listener) {
+ public void addChangeListener(EventListener listener) {
listeners.add(0, listener);
}
@Override
- public void removeChangeListener(ChangeListener listener) {
+ public void removeChangeListener(EventListener listener) {
listeners.remove(listener);
}
protected void fireChangeEvent() {
- ChangeEvent e = new ChangeEvent(this);
- ChangeListener[] list = listeners.toArray(new ChangeListener[0]);
- for (ChangeListener l : list) {
- l.stateChanged(e);
+ EventObject e = new EventObject(this);
+ for (EventListener l : listeners) {
+ if ( l instanceof StateChangeListener ) {
+ ((StateChangeListener)l).stateChanged(e);
+ }
}
}
*
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
- private class FigureTypeAction extends AbstractAction implements ChangeListener {
+ private class FigureTypeAction extends AbstractAction implements StateChangeListener {
private final int type;
public FigureTypeAction(int type) {
}
@Override
- public void stateChanged(ChangeEvent e) {
+ public void stateChanged(EventObject e) {
putValue(Action.SELECTED_KEY, figure.getType() == type);
}
}
package net.sf.openrocket.optimization.rocketoptimization.modifiers;
import java.util.ArrayList;
+import java.util.EventListener;
+import java.util.EventObject;
import java.util.List;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.optimization.general.OptimizationException;
import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.MathUtil;
+import net.sf.openrocket.util.StateChangeListener;
/**
* An abstract implementation of the SimulationModifier interface. An implementation
private double minValue = 0.0;
private double maxValue = 1.0;
- private final List<ChangeListener> listeners = new ArrayList<ChangeListener>();
+ private final List<EventListener> listeners = new ArrayList<EventListener>();
/**
@Override
- public void addChangeListener(ChangeListener listener) {
+ public void addChangeListener(EventListener listener) {
listeners.add(listener);
}
@Override
- public void removeChangeListener(ChangeListener listener) {
+ public void removeChangeListener(EventListener listener) {
listeners.remove(listener);
}
* Fire a change event to the listeners.
*/
protected void fireChangeEvent() {
- ChangeListener[] array = listeners.toArray(new ChangeListener[0]);
- ChangeEvent event = new ChangeEvent(this);
- for (ChangeListener l : array) {
- l.stateChanged(event);
+ EventObject event = new EventObject(this);
+ // Copy the list before iterating to prevent concurrent modification exceptions.
+ EventListener[] list = listeners.toArray(new EventListener[0]);
+ for (EventListener l : list) {
+ if ( l instanceof StateChangeListener ) {
+ ((StateChangeListener)l).stateChanged(event);
+ }
}
}
package net.sf.openrocket.rocketcomponent;
-import javax.swing.event.ChangeEvent;
+import java.util.EventObject;
-public class ComponentChangeEvent extends ChangeEvent {
+public class ComponentChangeEvent extends EventObject {
private static final long serialVersionUID = 1L;
import java.util.BitSet;
import java.util.Collection;
import java.util.Collections;
+import java.util.EventListener;
+import java.util.EventObject;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.EventListenerList;
-
import net.sf.openrocket.util.ArrayList;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.Monitorable;
+import net.sf.openrocket.util.StateChangeListener;
/**
private String motorConfiguration = null;
- private EventListenerList listenerList = new EventListenerList();
+ private List<EventListener> listenerList = new ArrayList<EventListener>();
/* Cached data */
//////////////// Listeners ////////////////
@Override
- public void addChangeListener(ChangeListener listener) {
- listenerList.add(ChangeListener.class, listener);
+ public void addChangeListener(EventListener listener) {
+ listenerList.add(listener);
}
@Override
- public void removeChangeListener(ChangeListener listener) {
- listenerList.remove(ChangeListener.class, listener);
+ public void removeChangeListener(EventListener listener) {
+ listenerList.remove(listener);
}
protected void fireChangeEvent() {
- Object[] listeners = listenerList.getListenerList();
- ChangeEvent e = new ChangeEvent(this);
+ EventObject e = new EventObject(this);
this.modID++;
boundsModID = -1;
refLengthModID = -1;
-
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == ChangeListener.class) {
- ((ChangeListener) listeners[i + 1]).stateChanged(e);
+
+ // Copy the list before iterating to prevent concurrent modification exceptions.
+ EventListener[] listeners = listenerList.toArray(new EventListener[0]);
+ for (EventListener l : listeners) {
+ if ( l instanceof StateChangeListener ) {
+ ((StateChangeListener)l).stateChanged(e);
}
}
}
public Configuration clone() {
try {
Configuration config = (Configuration) super.clone();
- config.listenerList = new EventListenerList();
+ config.listenerList = new ArrayList<EventListener>();
config.stages = (BitSet) this.stages.clone();
config.cachedBounds = new ArrayList<Coordinate>();
config.boundsModID = -1;
import java.util.Collection;
import java.util.Collections;
+import java.util.EventListener;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.EventListenerList;
-
import net.sf.openrocket.gui.main.ExceptionHandler;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.util.Chars;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil;
+import net.sf.openrocket.util.StateChangeListener;
import net.sf.openrocket.util.UniqueID;
/**
* List of component change listeners.
*/
- private EventListenerList listenerList = new EventListenerList();
+ private List<EventListener> listenerList = new ArrayList<EventListener>();
/**
* When freezeList != null, events are not dispatched but stored in the list.
*/
public void resetListeners() {
// System.out.println("RESETTING LISTENER LIST of Rocket "+this);
- listenerList = new EventListenerList();
+ listenerList = new ArrayList<EventListener>();
}
public void printListeners() {
- System.out.println("" + this + " has " + listenerList.getListenerCount() + " listeners:");
- Object[] list = listenerList.getListenerList();
- for (int i = 1; i < list.length; i += 2)
- System.out.println(" " + ((i + 1) / 2) + ": " + list[i]);
+ System.out.println("" + this + " has " + listenerList.size() + " listeners:");
+ int i =0;
+ for( EventListener l : listenerList ) {
+ System.out.println(" " + (i) + ": " + l);
+ i++;
+ }
}
@Override
public void addComponentChangeListener(ComponentChangeListener l) {
checkState();
- listenerList.add(ComponentChangeListener.class, l);
+ listenerList.add(l);
log.verbose("Added ComponentChangeListener " + l + ", current number of listeners is " +
- listenerList.getListenerCount());
+ listenerList.size());
}
@Override
public void removeComponentChangeListener(ComponentChangeListener l) {
- listenerList.remove(ComponentChangeListener.class, l);
+ listenerList.remove(l);
log.verbose("Removed ComponentChangeListener " + l + ", current number of listeners is " +
- listenerList.getListenerCount());
+ listenerList.size());
}
@Override
- public void addChangeListener(ChangeListener l) {
+ public void addChangeListener(EventListener l) {
checkState();
- listenerList.add(ChangeListener.class, l);
+ listenerList.add(l);
log.verbose("Added ChangeListener " + l + ", current number of listeners is " +
- listenerList.getListenerCount());
+ listenerList.size());
}
@Override
- public void removeChangeListener(ChangeListener l) {
- listenerList.remove(ChangeListener.class, l);
+ public void removeChangeListener(EventListener l) {
+ listenerList.remove(l);
log.verbose("Removed ChangeListener " + l + ", current number of listeners is " +
- listenerList.getListenerCount());
+ listenerList.size());
}
}
// Notify all listeners
- Object[] listeners = listenerList.getListenerList();
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == ComponentChangeListener.class) {
- ((ComponentChangeListener) listeners[i + 1]).componentChanged(e);
- } else if (listeners[i] == ChangeListener.class) {
- ((ChangeListener) listeners[i + 1]).stateChanged(e);
+ for ( EventListener l : listenerList ) {
+ if ( l instanceof ComponentChangeListener ) {
+ ((ComponentChangeListener) l ).componentChanged(e);
+ } else if ( l instanceof StateChangeListener ) {
+ ((StateChangeListener) l ).stateChanged(e);
}
}
} finally {
package net.sf.openrocket.rocketcomponent;
+import java.awt.Color;
+import java.util.ArrayDeque;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.EventListener;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.util.SafetyMutex;
import net.sf.openrocket.util.UniqueID;
-import javax.swing.event.ChangeListener;
-import java.awt.*;
-import java.util.ArrayDeque;
-import java.util.Collection;
-import java.util.Deque;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
public abstract class RocketComponent implements ChangeSource, Cloneable, Iterable<RocketComponent> {
private static final LogHelper log = Application.getLogger();
* @throws IllegalStateException - if the root component is not a <code>Rocket</code>
*/
@Override
- public void addChangeListener(ChangeListener l) {
+ public void addChangeListener(EventListener l) {
checkState();
getRocket().addChangeListener(l);
}
* @param l Listener to remove
*/
@Override
- public void removeChangeListener(ChangeListener l) {
+ public void removeChangeListener(EventListener l) {
if (this.parent != null) {
getRoot().removeChangeListener(l);
}
package net.sf.openrocket.simulation;
import java.util.ArrayList;
+import java.util.EventListener;
+import java.util.EventObject;
import java.util.List;
import java.util.Random;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
import net.sf.openrocket.masscalc.BasicMassCalculator;
import net.sf.openrocket.models.atmosphere.AtmosphericModel;
import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.GeodeticComputationStrategy;
import net.sf.openrocket.util.MathUtil;
+import net.sf.openrocket.util.StateChangeListener;
import net.sf.openrocket.util.Utils;
import net.sf.openrocket.util.WorldCoordinate;
private boolean calculateExtras = true;
- private List<ChangeListener> listeners = new ArrayList<ChangeListener>();
+ private List<EventListener> listeners = new ArrayList<EventListener>();
public SimulationOptions clone() {
try {
SimulationOptions copy = (SimulationOptions) super.clone();
- copy.listeners = new ArrayList<ChangeListener>();
+ copy.listeners = new ArrayList<EventListener>();
return copy;
} catch (CloneNotSupportedException e) {
throw new BugException(e);
}
@Override
- public void addChangeListener(ChangeListener listener) {
+ public void addChangeListener(EventListener listener) {
listeners.add(listener);
}
@Override
- public void removeChangeListener(ChangeListener listener) {
+ public void removeChangeListener(EventListener listener) {
listeners.remove(listener);
}
- private final ChangeEvent event = new ChangeEvent(this);
+ private final EventObject event = new EventObject(this);
private void fireChangeEvent() {
- ChangeListener[] array = listeners.toArray(new ChangeListener[0]);
- for (int i = array.length - 1; i >= 0; i--) {
- array[i].stateChanged(event);
+ // Copy the list before iterating to prevent concurrent modification exceptions.
+ EventListener[] list = listeners.toArray(new EventListener[0]);
+ for (EventListener l : list) {
+ if ( l instanceof StateChangeListener ) {
+ ((StateChangeListener)l).stateChanged(event);
+ }
}
}
package net.sf.openrocket.util;
+import java.util.EventListener;
+import java.util.EventObject;
import java.util.List;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.startup.Application;
public abstract class AbstractChangeSource implements ChangeSource {
private static final LogHelper log = Application.getLogger();
- private final List<ChangeListener> listeners = new ArrayList<ChangeListener>();
+ private final List<EventListener> listeners = new ArrayList<EventListener>();
- private final ChangeEvent event = new ChangeEvent(this);
+ private final EventObject event = new EventObject(this);
@Override
- public final void addChangeListener(ChangeListener listener) {
+ public final void addChangeListener(EventListener listener) {
listeners.add(listener);
log.verbose(1, "Adding change listeners, listener count is now " + listeners.size());
}
@Override
- public final void removeChangeListener(ChangeListener listener) {
+ public final void removeChangeListener(EventListener listener) {
listeners.remove(listener);
log.verbose(1, "Removing change listeners, listener count is now " + listeners.size());
}
* Fire a change event to all listeners.
*/
protected void fireChangeEvent() {
- ChangeListener[] array = listeners.toArray(new ChangeListener[0]);
-
- for (ChangeListener l : array) {
- l.stateChanged(event);
+ // Copy the list before iterating to prevent concurrent modification exceptions.
+ EventListener[] list = listeners.toArray(new EventListener[0]);
+ for (EventListener l : list) {
+ if ( l instanceof StateChangeListener ) {
+ ((StateChangeListener)l).stateChanged(event);
+ }
}
}
}
package net.sf.openrocket.util;
-import javax.swing.event.ChangeListener;
+import java.util.EventListener;
/**
* An interface defining an object firing ChangeEvents. Why isn't this included in the Java API??
*/
public interface ChangeSource {
- public void addChangeListener(ChangeListener listener);
- public void removeChangeListener(ChangeListener listener);
+ public void addChangeListener(EventListener listener);
+ public void removeChangeListener(EventListener listener);
}
--- /dev/null
+package net.sf.openrocket.util;\r
+\r
+import java.util.EventListener;\r
+import java.util.EventObject;\r
+\r
+public interface StateChangeListener extends EventListener {\r
+\r
+ public void stateChanged( EventObject e );\r
+\r
+}\r