Hello there, I've extended a SpinnerNumberModel, instantiated a JSpinner.NumberEditor and a JSpinner, and then set the model and editor of my JSpinner object accordingly but somehow when I try to edit the value through the spinner it doesn't respond(as in doesn't change the model's current value, gui animation is just fine) nor does it try to increment/decrement the value and I want to know why. It displays correctly though.
Here's the declaration for the class( ComboSlider ):
package tools.internal.colorchooser;
/**
*
* @author scphan
*/
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class ComboSlider extends JPanel implements ChangeListener, ColorController
{
private final AbstractSliderController slider;
private final JSpinner spinner;
public ComboSlider( final AbstractSliderController slider )
{
super();
if ( slider==null )
throw new NullPointerException( "slider arg is null" );
this.slider = slider;
this.spinner = new JSpinner(new CustomSpinnerModel());
final JSpinner.NumberEditor spinnerEditor = new JSpinner.NumberEditor( this.spinner, "0.00" );
this.spinner.setEditor( spinnerEditor );
this.spinner.setPreferredSize(new Dimension( 60, 20 )); this.spinner.addChangeListener( this );
setModel( this.slider.getModel() );
setLayout(new GridBagLayout());
final GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH; gbc.gridy = 0;
gbc.gridx = 0; gbc.weighty = 1; gbc.weightx = 0;
add( this.spinner, gbc );
gbc.gridx = 1; gbc.weighty = 1; gbc.weightx = 1;
add( this.slider, gbc );
}
public CCModel getModel()
{
return this.slider.getModel();
}
public void setModel( final CCModel model )
{
if ( model==null )
throw new NullPointerException( "model arg is null" );
else
{
model.addController( "combo_slider_"+this.slider.getSCCID(), this );
}
}
public void fireModelChanged()
{
((CustomSpinnerModel)this.spinner.getModel()).fireModelChanged();
}
public void stateChanged( ChangeEvent e )
{
}
protected class CustomSpinnerModel extends SpinnerNumberModel
{
void fireModelChanged()
{
fireStateChanged();
}
@Override
public Object getValue()
{
return ComboSlider.this.slider.getValue();
}
@Override
public void setValue( Object value )
{
System.out.println( "setValue() called" );
ComboSlider.this.slider.setValue( (Double)value );
fireStateChanged();
}
@Override
public Object getNextValue()
{
System.out.println( "getNextValue() called" );
final double ovalue = ComboSlider.this.slider.getValue(), xvalue = Math.ceil( ovalue );
final double xdelta = Math.abs( xvalue-ovalue );
final double nextValue = (xdelta<0.001)?Math.round(ovalue+1):xvalue;
if ( getMaximum().compareTo( nextValue ) >= 0 )
{
return nextValue;
}
else
{
return ovalue;
}
}
@Override
public Object getPreviousValue()
{
final double ovalue = ComboSlider.this.slider.getValue(), xvalue = Math.floor( ovalue );
final double xdelta = Math.abs( ovalue-xvalue );
final double previousValue = (xdelta<0.0001)?Math.round(ovalue-1):xvalue;
if ( getMinimum().compareTo( previousValue ) <= 0 )
{
return previousValue;
}
else
{
return ovalue;
}
}
@Override
public Comparable getMaximum()
{
final AbstractSliderController slider = ComboSlider.this.slider;
if ( slider instanceof RGBSlider )
{
return 255;
}
else
{
return 100;
}
}
@Override
public Comparable getMinimum()
{
final AbstractSliderController slider = ComboSlider.this.slider;
if ( slider instanceof RGBSlider )
{
return 0;
}
else
{
return 0;
}
}
@Override
public void setMaximum( Comparable value )
{
throw new UnsupportedOperationException();
}
@Override
public void setMinimum( Comparable value )
{
throw new UnsupportedOperationException();
}
@Override
public Number getNumber()
{
return (Number)getValue();
}
@Override
public Number getStepSize()
{
throw new UnsupportedOperationException();
}
@Override
public void setStepSize( Number stepSize )
{
throw new UnsupportedOperationException();
}
}
// *** for testing purposes *** //
public static void main( String... args )
{
JFrame f = new JFrame( "ComboSlider Test" );
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
final CCModel model = new CCModel(); model.setCurrentColor(new tools.internal.colorchooser.color.HSVColor( Color.GREEN ));
final HSVSlider hue = new HSVSlider( model, HSVSlider.HUE_MODE );
final ComboSlider cslider = new ComboSlider( hue );
f.add( cslider, BorderLayout.CENTER );
f.setSize( 400, 60 );
f.setVisible( true );
}
}
Any ideas would be helpful, thanks.
I'm just wondering why the spinner components(inc/dec btn.'s and textfield) just went dead as if they didn't trigger any events.
I'm not sure whether it's something trivial either.