/* * [Spinner.java] * * Summary: Demo of how to use DateSpinner, HexNumberEditor and DollarNumberEditor. * * Copyright: (c) 2007-2017 Roedy Green, Canadian Mind Products, http://mindprod.com * * Licence: This software may be copied and used freely for any purpose but military. * http://mindprod.com/contact/nonmil.html * * Requires: JDK 1.8+ * * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/ * * Version History: * 1.0 2007-09-08 initial version * 1.1 2011-03-22 bugs fixed in DateSpinner */ package com.mindprod.spinner; import com.mindprod.common18.BigDate; import com.mindprod.common18.FontFactory; import javax.swing.JFormattedTextField; import javax.swing.JFrame; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Insets; import static java.lang.System.*; /** * Demo of how to use DateSpinner, HexNumberEditor and DollarNumberEditor. * * @author Roedy Green, Canadian Mind Products * @version 1.1 2011-03-22 bugs fixed in DateSpinner * @since 2007-09-08 */ public final class Spinner { private static final int FIRST_COPYRIGHT_YEAR = 2007; /** * undisplayed copyright notice. * * @noinspection UnusedDeclaration */ private static final String EMBEDDED_COPYRIGHT = "Copyright: (c) 2007-2017 Roedy Green, Canadian Mind Products, http://mindprod.com"; private static final String RELEASE_DATE = "2011-03-22"; private static final String TITLE_STRING = "Spinner classes"; private static final String VERSION_STRING = "1.1"; /** * Debugging harness for a Frame * * @param args command line arguments are ignored. */ public static void main( String args[] ) { SwingUtilities.invokeLater( new Runnable() { /** * fire up a JFrame on the Swing thread */ public void run() { final JFrame jFrame = new JFrame(); final Container contentPane = jFrame.getContentPane(); contentPane.setLayout( new BorderLayout() ); // ordinary JSpinner final JSpinner sizeSpinner = new JSpinner(); sizeSpinner.setBackground( Color.BLACK ); sizeSpinner.setForeground( Color.YELLOW ); sizeSpinner.setFont( FontFactory.build( "Dialog", Font.BOLD, 15 ) ); sizeSpinner.setEnabled( true ); // how much space you want to freeze the spinner at. final Dimension d = new Dimension( 40, 25 ); sizeSpinner.setMinimumSize( d ); sizeSpinner.setPreferredSize( d ); sizeSpinner.setMaximumSize( d ); final SpinnerNumberModel sizeSpinnerModel = new SpinnerNumberModel( /* initial value */ 18, /* min */ 8, /* max */ 72, /* step */ 1 ); sizeSpinner.setModel( sizeSpinnerModel ); sizeSpinner.addChangeListener( new ChangeListener() { /** * Invoked when the JSpinner changes, even one notch in * moving to another value * @param e a ChangeEvent object */ public void stateChanged( ChangeEvent e ) { // do something when user changes the value. float setting = ( ( Number ) ( sizeSpinnerModel.getValue() ) ) .floatValue(); out.println( setting ); } } ); contentPane.add( sizeSpinner, BorderLayout.NORTH ); // ------------------------------------------ // use ordinary NumberModel, and custom HexNumberEditor final JSpinner hexSpinner = new JSpinner(); hexSpinner.setMinimumSize( d ); hexSpinner.setPreferredSize( d ); hexSpinner.setMaximumSize( d ); // hexNumberModel works with Longs on Integers final SpinnerNumberModel hexNumberModel = new SpinnerNumberModel( 0 /* init */, 0 /* min */, 0xff /* max */, 1 /* step */ ); hexSpinner.setModel( hexNumberModel ); final HexNumberEditor hne = new HexNumberEditor( hexSpinner, 2 ); hexSpinner.setEditor( hne ); // setBackground on JSpinner has no effect. final JFormattedTextField innerHexSpinner = hne.getTextField(); innerHexSpinner.setBackground( new Color( 0xffffe0 ) ); innerHexSpinner.setMargin( new Insets( 1, 1, 1, 1 ) ); hexSpinner.addChangeListener( new ChangeListener() { /** * Invoked when the JSpinner changes, even one notch in * moving to another value * @param e a ChangeEvent object */ public void stateChanged( ChangeEvent e ) { // do something when user changes the value. int setting = hexNumberModel.getNumber().intValue(); out.println( "Value:" + Integer.toHexString( setting ) ); } } ); contentPane.add( hexSpinner, BorderLayout.CENTER ); // ------------------------------------------------- // use ordinary NumberModel, and custom DollarNumberEditor final JSpinner dollarSpinner = new JSpinner(); dollarSpinner.setMinimumSize( d ); dollarSpinner.setPreferredSize( d ); dollarSpinner.setMaximumSize( d ); // ForgivingNumberModel works with Integers, Long or Doubles. final SpinnerNumberModel dollarNumberModel = new SpinnerNumberModel( /* init */ 10.00, /* min */ 0.00, /* max */ 10000.00, /* step */ .01 ); dollarSpinner.setModel( dollarNumberModel ); // use custom NumberEditor that makes keying the $ optional. final DollarNumberEditor fne = new DollarNumberEditor( dollarSpinner ); dollarSpinner.setEditor( fne ); // setBackground on JSpinner has no effect. final JFormattedTextField innerdollarSpinner = fne.getTextField(); innerdollarSpinner.setBackground( new Color( 0xffffe0 ) ); innerdollarSpinner.setMargin( new Insets( 1, 1, 1, 1 ) ); dollarSpinner.addChangeListener( new ChangeListener() { /** * Invoked when the JSpinner changes, even one notch in * moving to another value * @param e a ChangeEvent object */ public void stateChanged( ChangeEvent e ) { // do something when user changes the value. double setting = dollarNumberModel.getNumber().doubleValue(); out.println( "Value:" + setting ); } } ); contentPane.add( dollarSpinner, BorderLayout.SOUTH ); //----------------------------------------------------------- final DateSpinner dateSpinner = new DateSpinner(); dateSpinner.setMinimum( new BigDate( "1990-06-11" ) ); dateSpinner.setMaximum( new BigDate( "2012-02-09" ) ); dateSpinner.addChangeListener( new ChangeListener() { public void stateChanged( ChangeEvent e ) { BigDate v = dateSpinner.getValue(); out.println( v ); } } ); contentPane.add( dateSpinner, BorderLayout.EAST ); // ------------------------------------------------- jFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); jFrame.pack(); jFrame.setVisible( true ); out.println( "ready to go" ); } } ); } // end main }