Reduce dependency on swing ChangeListener and ChangeEvent classes. Changed the interface ChangeSource from using ChangeListener to using java.util.EventListener. Changed from using ChangeEvent object instances to using EventObject. Added marker interface StateChangeListener to declare a stateChanged method.

This commit is contained in:
Kevin Ruland 2011-12-05 18:49:49 +00:00
parent 1eb91a2b36
commit d30083c05b
15 changed files with 191 additions and 156 deletions

View File

@ -1,11 +1,10 @@
package net.sf.openrocket.aerodynamics; package net.sf.openrocket.aerodynamics;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EventListener;
import java.util.EventObject;
import java.util.List; 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.models.atmosphere.AtmosphericConditions;
import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.BugException;
@ -13,6 +12,7 @@ import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.Monitorable; import net.sf.openrocket.util.Monitorable;
import net.sf.openrocket.util.StateChangeListener;
import net.sf.openrocket.util.UniqueID; import net.sf.openrocket.util.UniqueID;
/** /**
@ -23,8 +23,8 @@ import net.sf.openrocket.util.UniqueID;
*/ */
public class FlightConditions implements Cloneable, ChangeSource, Monitorable { public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
private List<ChangeListener> listenerList = new ArrayList<ChangeListener>(); private List<EventListener> listenerList = new ArrayList<EventListener>();
private ChangeEvent event = new ChangeEvent(this); private EventObject event = new EventObject(this);
/** Reference length used in calculations. */ /** Reference length used in calculations. */
@ -409,8 +409,8 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
public FlightConditions clone() { public FlightConditions clone() {
try { try {
FlightConditions cond = (FlightConditions) super.clone(); FlightConditions cond = (FlightConditions) super.clone();
cond.listenerList = new ArrayList<ChangeListener>(); cond.listenerList = new ArrayList<EventListener>();
cond.event = new ChangeEvent(cond); cond.event = new EventObject(cond);
cond.atmosphericConditions = atmosphericConditions.clone(); cond.atmosphericConditions = atmosphericConditions.clone();
return cond; return cond;
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
@ -445,20 +445,23 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
@Override @Override
public void addChangeListener(ChangeListener listener) { public void addChangeListener(EventListener listener) {
listenerList.add(0, listener); listenerList.add(0, listener);
} }
@Override @Override
public void removeChangeListener(ChangeListener listener) { public void removeChangeListener(EventListener listener) {
listenerList.remove(listener); listenerList.remove(listener);
} }
protected void fireChangeEvent() { protected void fireChangeEvent() {
modID = UniqueID.next(); modID = UniqueID.next();
ChangeListener[] listeners = listenerList.toArray(new ChangeListener[0]); // Copy the list before iterating to prevent concurrent modification exceptions.
for (ChangeListener l : listeners) { EventListener[] listeners = listenerList.toArray(new EventListener[0]);
l.stateChanged(event); for (EventListener l : listeners) {
if ( l instanceof StateChangeListener ) {
((StateChangeListener)l).stateChanged(event);
}
} }
} }
} }

View File

@ -1,10 +1,9 @@
package net.sf.openrocket.document; package net.sf.openrocket.document;
import java.util.EventListener;
import java.util.EventObject;
import java.util.List; 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.AerodynamicCalculator;
import net.sf.openrocket.aerodynamics.BarrowmanCalculator; import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.aerodynamics.WarningSet;
@ -28,6 +27,7 @@ import net.sf.openrocket.util.ArrayList;
import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.ChangeSource; import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.SafetyMutex; import net.sf.openrocket.util.SafetyMutex;
import net.sf.openrocket.util.StateChangeListener;
/** /**
* A class defining a simulation, its conditions and simulated data. * A class defining a simulation, its conditions and simulated data.
@ -79,7 +79,7 @@ public class Simulation implements ChangeSource, Cloneable {
/** Listeners for this object */ /** 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 */ /** The conditions actually used in the previous simulation, or null */
@ -386,7 +386,7 @@ public class Simulation implements ChangeSource, Cloneable {
copy.status = Status.NOT_SIMULATED; copy.status = Status.NOT_SIMULATED;
copy.options = this.options.clone(); copy.options = this.options.clone();
copy.simulationListeners = this.simulationListeners.clone(); copy.simulationListeners = this.simulationListeners.clone();
copy.listeners = new ArrayList<ChangeListener>(); copy.listeners = new ArrayList<EventListener>();
copy.simulatedConditions = null; copy.simulatedConditions = null;
copy.simulatedMotors = null; copy.simulatedMotors = null;
copy.simulatedData = null; copy.simulatedData = null;
@ -429,34 +429,37 @@ public class Simulation implements ChangeSource, Cloneable {
@Override @Override
public void addChangeListener(ChangeListener listener) { public void addChangeListener(EventListener listener) {
mutex.verify(); mutex.verify();
listeners.add(listener); listeners.add(listener);
} }
@Override @Override
public void removeChangeListener(ChangeListener listener) { public void removeChangeListener(EventListener listener) {
mutex.verify(); mutex.verify();
listeners.remove(listener); listeners.remove(listener);
} }
protected void fireChangeEvent() { protected void fireChangeEvent() {
ChangeListener[] ls = listeners.toArray(new ChangeListener[0]); EventObject e = new EventObject(this);
ChangeEvent e = new ChangeEvent(this); // Copy the list before iterating to prevent concurrent modification exceptions.
for (ChangeListener l : ls) { EventListener[] ls = listeners.toArray(new EventListener[0]);
l.stateChanged(e); 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; private Status oldStatus = null;
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(EventObject e) {
if (getStatus() != oldStatus) { if (getStatus() != oldStatus) {
oldStatus = getStatus(); oldStatus = getStatus();
fireChangeEvent(); fireChangeEvent();

View File

@ -6,13 +6,14 @@ import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EventListener;
import java.util.EventObject;
import javax.swing.AbstractAction; import javax.swing.AbstractAction;
import javax.swing.Action; import javax.swing.Action;
import javax.swing.BoundedRangeModel; import javax.swing.BoundedRangeModel;
import javax.swing.SpinnerModel; import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel; import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.logging.LogHelper;
@ -26,6 +27,7 @@ import net.sf.openrocket.util.Invalidator;
import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.MemoryManagement; import net.sf.openrocket.util.MemoryManagement;
import net.sf.openrocket.util.Reflection; import net.sf.openrocket.util.Reflection;
import net.sf.openrocket.util.StateChangeListener;
/** /**
@ -42,7 +44,7 @@ import net.sf.openrocket.util.Reflection;
* @author Sampo Niskanen <sampo.niskanen@iki.fi> * @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(); private static final LogHelper log = Application.getLogger();
@ -147,7 +149,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
//////////// JSlider model //////////// //////////// JSlider model ////////////
private class ValueSliderModel implements BoundedRangeModel, ChangeListener, Invalidatable { private class ValueSliderModel implements BoundedRangeModel, StateChangeListener, Invalidatable {
private static final int MAX = 1000; private static final int MAX = 1000;
/* /*
@ -361,7 +363,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
} }
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(EventObject e) {
// Min or max range has changed. // Min or max range has changed.
// Fire if not already firing // Fire if not already firing
if (firing == 0) if (firing == 0)
@ -392,7 +394,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
//////////// Action model //////////// //////////// Action model ////////////
private class AutomaticActionModel extends AbstractAction implements ChangeListener, Invalidatable { private class AutomaticActionModel extends AbstractAction implements StateChangeListener, Invalidatable {
private boolean oldValue = false; private boolean oldValue = false;
public AutomaticActionModel() { public AutomaticActionModel() {
@ -453,7 +455,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
// If the value has changed, generate an event to the listeners // If the value has changed, generate an event to the listeners
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(EventObject e) {
boolean newValue = isAutomatic(); boolean newValue = isAutomatic();
if (oldValue == newValue) if (oldValue == newValue)
return; return;
@ -507,7 +509,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
private final Method getAutoMethod; private final Method getAutoMethod;
private final Method setAutoMethod; 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 final UnitGroup units;
private Unit currentUnit; private Unit currentUnit;
@ -815,7 +817,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
* @param l Listener to add. * @param l Listener to add.
*/ */
@Override @Override
public void addChangeListener(ChangeListener l) { public void addChangeListener(EventListener l) {
checkState(true); checkState(true);
if (listeners.isEmpty()) { if (listeners.isEmpty()) {
@ -836,7 +838,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
* @param l Listener to remove. * @param l Listener to remove.
*/ */
@Override @Override
public void removeChangeListener(ChangeListener l) { public void removeChangeListener(EventListener l) {
checkState(false); checkState(false);
listeners.remove(l); listeners.remove(l);
@ -888,11 +890,15 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
protected void fireStateChanged() { protected void fireStateChanged() {
checkState(true); checkState(true);
Object[] l = listeners.toArray(); EventObject event = new EventObject(this);
ChangeEvent event = new ChangeEvent(this);
firing++; firing++;
for (int i = 0; i < l.length; i++) // Copy the list before iterating to prevent concurrent modification exceptions.
((ChangeListener) l[i]).stateChanged(event); EventListener[] ls = listeners.toArray(new EventListener[0]);
for (EventListener l : ls) {
if ( l instanceof StateChangeListener ) {
((StateChangeListener)l).stateChanged(event);
}
}
firing--; firing--;
} }
@ -901,7 +907,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
* it has, updates lastValue and generates ChangeEvents for all listeners of the model. * it has, updates lastValue and generates ChangeEvents for all listeners of the model.
*/ */
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(EventObject e) {
checkState(true); checkState(true);
double v = getValue(); double v = getValue();

View File

@ -1,13 +1,12 @@
package net.sf.openrocket.gui.adaptors; package net.sf.openrocket.gui.adaptors;
import java.util.EventObject;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.swing.ComboBoxModel; import javax.swing.ComboBoxModel;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList; import javax.swing.event.EventListenerList;
import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener; import javax.swing.event.ListDataListener;
@ -19,8 +18,9 @@ import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.startup.Application; 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 Translator trans = Application.getTranslator();
private static final String EDIT = trans.get("MotorCfgModel.Editcfg"); private static final String EDIT = trans.get("MotorCfgModel.Editcfg");
@ -121,7 +121,7 @@ public class MotorConfigurationModel implements ComboBoxModel, ChangeListener {
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(EventObject e) {
if (e instanceof ComponentChangeEvent) { if (e instanceof ComponentChangeEvent) {
// Ignore unnecessary changes // Ignore unnecessary changes
if (!((ComponentChangeEvent)e).isMotorChange()) if (!((ComponentChangeEvent)e).isMotorChange())

View File

@ -2,14 +2,15 @@ package net.sf.openrocket.gui.scalefigure;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.util.EventListener;
import java.util.EventObject;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import javax.swing.JPanel; 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.Prefs;
import net.sf.openrocket.util.StateChangeListener;
public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure { public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure {
@ -27,7 +28,7 @@ public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure
protected int borderPixelsWidth = DEFAULT_BORDER_PIXELS_WIDTH; protected int borderPixelsWidth = DEFAULT_BORDER_PIXELS_WIDTH;
protected int borderPixelsHeight = DEFAULT_BORDER_PIXELS_HEIGHT; 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() { public AbstractScaleFigure() {
@ -106,23 +107,26 @@ public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure
@Override @Override
public void addChangeListener(ChangeListener listener) { public void addChangeListener(EventListener listener) {
listeners.add(0, listener); listeners.add(0, listener);
} }
@Override @Override
public void removeChangeListener(ChangeListener listener) { public void removeChangeListener(EventListener listener) {
listeners.remove(listener); listeners.remove(listener);
} }
private ChangeEvent changeEvent = null; private EventObject changeEvent = null;
protected void fireChangeEvent() { protected void fireChangeEvent() {
ChangeListener[] list = listeners.toArray(new ChangeListener[0]); if (changeEvent == null)
for (ChangeListener l : list) { changeEvent = new EventObject(this);
if (changeEvent == null) // Copy the list before iterating to prevent concurrent modification exceptions.
changeEvent = new ChangeEvent(this); EventListener[] list = listeners.toArray(new EventListener[0]);
l.stateChanged(changeEvent); for (EventListener l : list) {
if ( l instanceof StateChangeListener ) {
((StateChangeListener)l).stateChanged(changeEvent);
}
} }
} }

View File

@ -9,6 +9,8 @@ import java.awt.event.InputEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.EventListener;
import java.util.EventObject;
import java.util.List; import java.util.List;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@ -23,8 +25,6 @@ import javax.swing.JSlider;
import javax.swing.JToggleButton; import javax.swing.JToggleButton;
import javax.swing.JViewport; import javax.swing.JViewport;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener; import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath; import javax.swing.tree.TreePath;
@ -68,6 +68,7 @@ import net.sf.openrocket.util.Chars;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.Prefs; import net.sf.openrocket.util.Prefs;
import net.sf.openrocket.util.StateChangeListener;
/** /**
* A JPanel that contains a RocketFigure and buttons to manipulate the figure. * A JPanel that contains a RocketFigure and buttons to manipulate the figure.
@ -110,7 +111,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
private SimulationWorker backgroundSimulationWorker = null; private SimulationWorker backgroundSimulationWorker = null;
private List<ChangeListener> listeners = new ArrayList<ChangeListener>(); private List<EventListener> listeners = new ArrayList<EventListener>();
/** /**
@ -158,9 +159,9 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
createPanel(); createPanel();
configuration.addChangeListener(new ChangeListener() { configuration.addChangeListener(new StateChangeListener() {
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(EventObject e) {
System.out.println("Configuration changed, calling updateFigure"); System.out.println("Configuration changed, calling updateFigure");
updateExtras(); updateExtras();
figure.updateFigure(); figure.updateFigure();
@ -374,20 +375,21 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
@Override @Override
public void addChangeListener(ChangeListener listener) { public void addChangeListener(EventListener listener) {
listeners.add(0, listener); listeners.add(0, listener);
} }
@Override @Override
public void removeChangeListener(ChangeListener listener) { public void removeChangeListener(EventListener listener) {
listeners.remove(listener); listeners.remove(listener);
} }
protected void fireChangeEvent() { protected void fireChangeEvent() {
ChangeEvent e = new ChangeEvent(this); EventObject e = new EventObject(this);
ChangeListener[] list = listeners.toArray(new ChangeListener[0]); for (EventListener l : listeners) {
for (ChangeListener l : list) { if ( l instanceof StateChangeListener ) {
l.stateChanged(e); ((StateChangeListener)l).stateChanged(e);
}
} }
} }
@ -711,7 +713,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
* *
* @author Sampo Niskanen <sampo.niskanen@iki.fi> * @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; private final int type;
public FigureTypeAction(int type) { public FigureTypeAction(int type) {
@ -732,7 +734,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
} }
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(EventObject e) {
putValue(Action.SELECTED_KEY, figure.getType() == type); putValue(Action.SELECTED_KEY, figure.getType() == type);
} }
} }

View File

@ -1,16 +1,16 @@
package net.sf.openrocket.optimization.rocketoptimization.modifiers; package net.sf.openrocket.optimization.rocketoptimization.modifiers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EventListener;
import java.util.EventObject;
import java.util.List; import java.util.List;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.sf.openrocket.document.Simulation; import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.optimization.general.OptimizationException; import net.sf.openrocket.optimization.general.OptimizationException;
import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier; import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier;
import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.StateChangeListener;
/** /**
* An abstract implementation of the SimulationModifier interface. An implementation * An abstract implementation of the SimulationModifier interface. An implementation
@ -29,7 +29,7 @@ public abstract class AbstractSimulationModifier implements SimulationModifier {
private double minValue = 0.0; private double minValue = 0.0;
private double maxValue = 1.0; private double maxValue = 1.0;
private final List<ChangeListener> listeners = new ArrayList<ChangeListener>(); private final List<EventListener> listeners = new ArrayList<EventListener>();
/** /**
@ -148,12 +148,12 @@ public abstract class AbstractSimulationModifier implements SimulationModifier {
@Override @Override
public void addChangeListener(ChangeListener listener) { public void addChangeListener(EventListener listener) {
listeners.add(listener); listeners.add(listener);
} }
@Override @Override
public void removeChangeListener(ChangeListener listener) { public void removeChangeListener(EventListener listener) {
listeners.remove(listener); listeners.remove(listener);
} }
@ -162,10 +162,13 @@ public abstract class AbstractSimulationModifier implements SimulationModifier {
* Fire a change event to the listeners. * Fire a change event to the listeners.
*/ */
protected void fireChangeEvent() { protected void fireChangeEvent() {
ChangeListener[] array = listeners.toArray(new ChangeListener[0]); EventObject event = new EventObject(this);
ChangeEvent event = new ChangeEvent(this); // Copy the list before iterating to prevent concurrent modification exceptions.
for (ChangeListener l : array) { EventListener[] list = listeners.toArray(new EventListener[0]);
l.stateChanged(event); for (EventListener l : list) {
if ( l instanceof StateChangeListener ) {
((StateChangeListener)l).stateChanged(event);
}
} }
} }

View File

@ -1,8 +1,8 @@
package net.sf.openrocket.rocketcomponent; 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; private static final long serialVersionUID = 1L;

View File

@ -3,20 +3,19 @@ package net.sf.openrocket.rocketcomponent;
import java.util.BitSet; import java.util.BitSet;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.EventListener;
import java.util.EventObject;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException; 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.ArrayList;
import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.ChangeSource; import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.Monitorable; import net.sf.openrocket.util.Monitorable;
import net.sf.openrocket.util.StateChangeListener;
/** /**
@ -34,7 +33,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
private String motorConfiguration = null; private String motorConfiguration = null;
private EventListenerList listenerList = new EventListenerList(); private List<EventListener> listenerList = new ArrayList<EventListener>();
/* Cached data */ /* Cached data */
@ -199,26 +198,27 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
//////////////// Listeners //////////////// //////////////// Listeners ////////////////
@Override @Override
public void addChangeListener(ChangeListener listener) { public void addChangeListener(EventListener listener) {
listenerList.add(ChangeListener.class, listener); listenerList.add(listener);
} }
@Override @Override
public void removeChangeListener(ChangeListener listener) { public void removeChangeListener(EventListener listener) {
listenerList.remove(ChangeListener.class, listener); listenerList.remove(listener);
} }
protected void fireChangeEvent() { protected void fireChangeEvent() {
Object[] listeners = listenerList.getListenerList(); EventObject e = new EventObject(this);
ChangeEvent e = new ChangeEvent(this);
this.modID++; this.modID++;
boundsModID = -1; boundsModID = -1;
refLengthModID = -1; refLengthModID = -1;
for (int i = listeners.length - 2; i >= 0; i -= 2) { // Copy the list before iterating to prevent concurrent modification exceptions.
if (listeners[i] == ChangeListener.class) { EventListener[] listeners = listenerList.toArray(new EventListener[0]);
((ChangeListener) listeners[i + 1]).stateChanged(e); for (EventListener l : listeners) {
if ( l instanceof StateChangeListener ) {
((StateChangeListener)l).stateChanged(e);
} }
} }
} }
@ -340,7 +340,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
public Configuration clone() { public Configuration clone() {
try { try {
Configuration config = (Configuration) super.clone(); Configuration config = (Configuration) super.clone();
config.listenerList = new EventListenerList(); config.listenerList = new ArrayList<EventListener>();
config.stages = (BitSet) this.stages.clone(); config.stages = (BitSet) this.stages.clone();
config.cachedBounds = new ArrayList<Coordinate>(); config.cachedBounds = new ArrayList<Coordinate>();
config.boundsModID = -1; config.boundsModID = -1;

View File

@ -2,15 +2,13 @@ package net.sf.openrocket.rocketcomponent;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.EventListener;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.UUID; 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.gui.main.ExceptionHandler;
import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.logging.LogHelper;
@ -20,6 +18,7 @@ import net.sf.openrocket.util.ArrayList;
import net.sf.openrocket.util.Chars; import net.sf.openrocket.util.Chars;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.StateChangeListener;
import net.sf.openrocket.util.UniqueID; import net.sf.openrocket.util.UniqueID;
@ -43,7 +42,7 @@ public class Rocket extends RocketComponent {
/** /**
* List of component change listeners. * 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. * When freezeList != null, events are not dispatched but stored in the list.
@ -341,46 +340,48 @@ public class Rocket extends RocketComponent {
*/ */
public void resetListeners() { public void resetListeners() {
// System.out.println("RESETTING LISTENER LIST of Rocket "+this); // System.out.println("RESETTING LISTENER LIST of Rocket "+this);
listenerList = new EventListenerList(); listenerList = new ArrayList<EventListener>();
} }
public void printListeners() { public void printListeners() {
System.out.println("" + this + " has " + listenerList.getListenerCount() + " listeners:"); System.out.println("" + this + " has " + listenerList.size() + " listeners:");
Object[] list = listenerList.getListenerList(); int i =0;
for (int i = 1; i < list.length; i += 2) for( EventListener l : listenerList ) {
System.out.println(" " + ((i + 1) / 2) + ": " + list[i]); System.out.println(" " + (i) + ": " + l);
i++;
}
} }
@Override @Override
public void addComponentChangeListener(ComponentChangeListener l) { public void addComponentChangeListener(ComponentChangeListener l) {
checkState(); checkState();
listenerList.add(ComponentChangeListener.class, l); listenerList.add(l);
log.verbose("Added ComponentChangeListener " + l + ", current number of listeners is " + log.verbose("Added ComponentChangeListener " + l + ", current number of listeners is " +
listenerList.getListenerCount()); listenerList.size());
} }
@Override @Override
public void removeComponentChangeListener(ComponentChangeListener l) { public void removeComponentChangeListener(ComponentChangeListener l) {
listenerList.remove(ComponentChangeListener.class, l); listenerList.remove(l);
log.verbose("Removed ComponentChangeListener " + l + ", current number of listeners is " + log.verbose("Removed ComponentChangeListener " + l + ", current number of listeners is " +
listenerList.getListenerCount()); listenerList.size());
} }
@Override @Override
public void addChangeListener(ChangeListener l) { public void addChangeListener(EventListener l) {
checkState(); checkState();
listenerList.add(ChangeListener.class, l); listenerList.add(l);
log.verbose("Added ChangeListener " + l + ", current number of listeners is " + log.verbose("Added ChangeListener " + l + ", current number of listeners is " +
listenerList.getListenerCount()); listenerList.size());
} }
@Override @Override
public void removeChangeListener(ChangeListener l) { public void removeChangeListener(EventListener l) {
listenerList.remove(ChangeListener.class, l); listenerList.remove(l);
log.verbose("Removed ChangeListener " + l + ", current number of listeners is " + log.verbose("Removed ChangeListener " + l + ", current number of listeners is " +
listenerList.getListenerCount()); listenerList.size());
} }
@ -419,12 +420,11 @@ public class Rocket extends RocketComponent {
} }
// Notify all listeners // Notify all listeners
Object[] listeners = listenerList.getListenerList(); for ( EventListener l : listenerList ) {
for (int i = listeners.length - 2; i >= 0; i -= 2) { if ( l instanceof ComponentChangeListener ) {
if (listeners[i] == ComponentChangeListener.class) { ((ComponentChangeListener) l ).componentChanged(e);
((ComponentChangeListener) listeners[i + 1]).componentChanged(e); } else if ( l instanceof StateChangeListener ) {
} else if (listeners[i] == ChangeListener.class) { ((StateChangeListener) l ).stateChanged(e);
((ChangeListener) listeners[i + 1]).stateChanged(e);
} }
} }
} finally { } finally {

View File

@ -1,5 +1,14 @@
package net.sf.openrocket.rocketcomponent; 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.l10n.Translator;
import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset;
@ -14,15 +23,6 @@ import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.SafetyMutex; import net.sf.openrocket.util.SafetyMutex;
import net.sf.openrocket.util.UniqueID; 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> { public abstract class RocketComponent implements ChangeSource, Cloneable, Iterable<RocketComponent> {
private static final LogHelper log = Application.getLogger(); private static final LogHelper log = Application.getLogger();
@ -1470,7 +1470,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
* @throws IllegalStateException - if the root component is not a <code>Rocket</code> * @throws IllegalStateException - if the root component is not a <code>Rocket</code>
*/ */
@Override @Override
public void addChangeListener(ChangeListener l) { public void addChangeListener(EventListener l) {
checkState(); checkState();
getRocket().addChangeListener(l); getRocket().addChangeListener(l);
} }
@ -1484,7 +1484,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
* @param l Listener to remove * @param l Listener to remove
*/ */
@Override @Override
public void removeChangeListener(ChangeListener l) { public void removeChangeListener(EventListener l) {
if (this.parent != null) { if (this.parent != null) {
getRoot().removeChangeListener(l); getRoot().removeChangeListener(l);
} }

View File

@ -1,12 +1,11 @@
package net.sf.openrocket.simulation; package net.sf.openrocket.simulation;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EventListener;
import java.util.EventObject;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.sf.openrocket.aerodynamics.BarrowmanCalculator; import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
import net.sf.openrocket.masscalc.BasicMassCalculator; import net.sf.openrocket.masscalc.BasicMassCalculator;
import net.sf.openrocket.models.atmosphere.AtmosphericModel; import net.sf.openrocket.models.atmosphere.AtmosphericModel;
@ -19,6 +18,7 @@ import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.ChangeSource; import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.GeodeticComputationStrategy; import net.sf.openrocket.util.GeodeticComputationStrategy;
import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.StateChangeListener;
import net.sf.openrocket.util.Utils; import net.sf.openrocket.util.Utils;
import net.sf.openrocket.util.WorldCoordinate; import net.sf.openrocket.util.WorldCoordinate;
@ -85,7 +85,7 @@ public class SimulationOptions implements ChangeSource, Cloneable {
private boolean calculateExtras = true; private boolean calculateExtras = true;
private List<ChangeListener> listeners = new ArrayList<ChangeListener>(); private List<EventListener> listeners = new ArrayList<EventListener>();
@ -386,7 +386,7 @@ public class SimulationOptions implements ChangeSource, Cloneable {
public SimulationOptions clone() { public SimulationOptions clone() {
try { try {
SimulationOptions copy = (SimulationOptions) super.clone(); SimulationOptions copy = (SimulationOptions) super.clone();
copy.listeners = new ArrayList<ChangeListener>(); copy.listeners = new ArrayList<EventListener>();
return copy; return copy;
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
throw new BugException(e); throw new BugException(e);
@ -477,22 +477,25 @@ public class SimulationOptions implements ChangeSource, Cloneable {
} }
@Override @Override
public void addChangeListener(ChangeListener listener) { public void addChangeListener(EventListener listener) {
listeners.add(listener); listeners.add(listener);
} }
@Override @Override
public void removeChangeListener(ChangeListener listener) { public void removeChangeListener(EventListener listener) {
listeners.remove(listener); listeners.remove(listener);
} }
private final ChangeEvent event = new ChangeEvent(this); private final EventObject event = new EventObject(this);
private void fireChangeEvent() { private void fireChangeEvent() {
ChangeListener[] array = listeners.toArray(new ChangeListener[0]);
for (int i = array.length - 1; i >= 0; i--) { // Copy the list before iterating to prevent concurrent modification exceptions.
array[i].stateChanged(event); EventListener[] list = listeners.toArray(new EventListener[0]);
for (EventListener l : list) {
if ( l instanceof StateChangeListener ) {
((StateChangeListener)l).stateChanged(event);
}
} }
} }

View File

@ -1,10 +1,9 @@
package net.sf.openrocket.util; package net.sf.openrocket.util;
import java.util.EventListener;
import java.util.EventObject;
import java.util.List; import java.util.List;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Application;
@ -16,19 +15,19 @@ import net.sf.openrocket.startup.Application;
public abstract class AbstractChangeSource implements ChangeSource { public abstract class AbstractChangeSource implements ChangeSource {
private static final LogHelper log = Application.getLogger(); 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 @Override
public final void addChangeListener(ChangeListener listener) { public final void addChangeListener(EventListener listener) {
listeners.add(listener); listeners.add(listener);
log.verbose(1, "Adding change listeners, listener count is now " + listeners.size()); log.verbose(1, "Adding change listeners, listener count is now " + listeners.size());
} }
@Override @Override
public final void removeChangeListener(ChangeListener listener) { public final void removeChangeListener(EventListener listener) {
listeners.remove(listener); listeners.remove(listener);
log.verbose(1, "Removing change listeners, listener count is now " + listeners.size()); log.verbose(1, "Removing change listeners, listener count is now " + listeners.size());
} }
@ -38,10 +37,12 @@ public abstract class AbstractChangeSource implements ChangeSource {
* Fire a change event to all listeners. * Fire a change event to all listeners.
*/ */
protected void fireChangeEvent() { protected void fireChangeEvent() {
ChangeListener[] array = listeners.toArray(new ChangeListener[0]); // Copy the list before iterating to prevent concurrent modification exceptions.
EventListener[] list = listeners.toArray(new EventListener[0]);
for (ChangeListener l : array) { for (EventListener l : list) {
l.stateChanged(event); if ( l instanceof StateChangeListener ) {
((StateChangeListener)l).stateChanged(event);
}
} }
} }
} }

View File

@ -1,6 +1,6 @@
package net.sf.openrocket.util; 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?? * An interface defining an object firing ChangeEvents. Why isn't this included in the Java API??
@ -9,7 +9,7 @@ import javax.swing.event.ChangeListener;
*/ */
public interface ChangeSource { public interface ChangeSource {
public void addChangeListener(ChangeListener listener); public void addChangeListener(EventListener listener);
public void removeChangeListener(ChangeListener listener); public void removeChangeListener(EventListener listener);
} }

View File

@ -0,0 +1,10 @@
package net.sf.openrocket.util;
import java.util.EventListener;
import java.util.EventObject;
public interface StateChangeListener extends EventListener {
public void stateChanged( EventObject e );
}