Skip to content

Commit

Permalink
Added DynamicSpinnerNumberModel to have changeable ranges at runtime.…
Browse files Browse the repository at this point in the history
… Doesn't work beyond data endpoints yet.
  • Loading branch information
carsonalh committed Jun 13, 2019
1 parent 3e9639c commit 2c65e40
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 4 deletions.
7 changes: 5 additions & 2 deletions src/gui/discrete/DiscreteSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public DiscreteSettings() {
rangeStartSpinner.setModel(new SpinnerNumberModel(0, 0, 1e7, .1));
rangeStrideSpinner.setModel(new SpinnerNumberModel(1, 0, 1e7, .1));
sigmaXSpinner.setModel(new SpinnerNumberModel(1, 0, 1e7, .1));
centerSpinner.setModel(new SpinnerNumberModel(1, 0, 1e7, .1));
centerSpinner.setModel(new DynamicSpinnerNumberModel<Double>(0.0, 0.0, 10.0, 0.01));

// Set the spinners to the default values
DiscreteGenerator g = new DiscreteGenerator();
Expand Down Expand Up @@ -186,7 +186,10 @@ public void setCenterRange(double start, double end) {
if (!(start <= center && center <= end))
center = start;

centerSpinner.setModel(new SpinnerNumberModel(center, start, end, 0.1));
DynamicSpinnerNumberModel<Double> centerModel = (DynamicSpinnerNumberModel<Double>) centerSpinner.getModel();
centerModel.setMinimumValue(start);
centerModel.setMaximumValue(end);
centerModel.setValue(center);
}

public void addListener(Listener<SettingsData> l) {
Expand Down
120 changes: 120 additions & 0 deletions src/gui/discrete/DynamicSpinnerNumberModel.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package gui.discrete;

import com.sun.istack.internal.NotNull;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.util.ArrayList;

public class DynamicSpinnerNumberModel<T extends Number> extends SpinnerNumberModel {

private ArrayList<ChangeListener> changeListeners;

private T value;
private T minimumValue;
private T maximumValue;
private T stepSize;

public DynamicSpinnerNumberModel(@NotNull T initialValue, @NotNull T minimumValue, @NotNull T maximumValue, @NotNull T stepSize) {
this.value = initialValue;
this.minimumValue = minimumValue;
this.maximumValue = maximumValue;
this.stepSize = stepSize;

this.changeListeners = new ArrayList<>();
}

private boolean inRange(T number) {
double tempMin, tempMax, tempOther;

tempMin = this.minimumValue.doubleValue();
tempMax = this.maximumValue.doubleValue();
tempOther = value.doubleValue();

// The new value is between the range
return tempMin < tempOther && tempOther < tempMax;
}

@Override
public Object getValue() {
return value;
}

@Override
public void setValue(Object value) {
if (inRange((T) value)) {
this.value = (T) value;

fireChangeListeners();
}
}

@Override
public Object getNextValue() {
T attemptedValue = (T) Double.valueOf(value.doubleValue() + stepSize.doubleValue());

if (inRange(attemptedValue))
return attemptedValue;
else
return value;
}

@Override
public Object getPreviousValue() {
T attemptedValue = (T) Double.valueOf(value.doubleValue() - stepSize.doubleValue());

if (inRange(attemptedValue))
return attemptedValue;
else
return value;
}

@Override
public void addChangeListener(ChangeListener l) {
this.changeListeners.add(l);
}

@Override
public void removeChangeListener(ChangeListener l) {
this.changeListeners.remove(l);
}

public T getMinimumValue() {
return minimumValue;
}

public void setMinimumValue(T minimumValue) {
if (maximumValue.doubleValue() < maximumValue.doubleValue())
return;

this.minimumValue = minimumValue;

if (!inRange(value)) {
value = minimumValue;
}
}

public T getMaximumValue() {
return maximumValue;
}

public void setMaximumValue(T maximumValue) {
if (maximumValue.doubleValue() < maximumValue.doubleValue())
return;

this.maximumValue = maximumValue;

if (!inRange(value)) {
value = minimumValue;
}
}

private void fireChangeListeners() {
ChangeEvent e = new ChangeEvent(this);

for (ChangeListener l : this.changeListeners)
l.stateChanged(e);
}

}
2 changes: 0 additions & 2 deletions src/gui/discrete/MainPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,6 @@ private void updateGraph(DiscreteSettings.SettingsData data) {
generator.setCenter(data.center);
generator.setCount(data.count);

updateCenter(data);

this.data = generator.genData();
discreteGraph.setData(this.data);
}
Expand Down

0 comments on commit 2c65e40

Please sign in to comment.