Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

JSpinner buttons and field are not working properly

843807Sep 14 2009 — edited Sep 14 2009
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.
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Oct 12 2009
Added on Sep 14 2009
7 comments
500 views