import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
import javax.swing.*;/**
   A program to test spinners.
*/
public class SpinnerTest
{
   public static void main(String[] args)
   {
      SpinnerFrame frame = new SpinnerFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.show();
   }
}/**
   A frame with a panel that contains several spinners and
   a button that displays the spinner values.
*/
class SpinnerFrame extends JFrame
{
   public SpinnerFrame()
   {
      setTitle("SpinnerTest");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
      Container contentPane = getContentPane();
      JPanel buttonPanel = new JPanel();
      okButton = new JButton("Ok");
      buttonPanel.add(okButton);
      contentPane.add(buttonPanel, BorderLayout.SOUTH);      mainPanel = new JPanel();
      mainPanel.setLayout(new GridLayout(0, 3));
      contentPane.add(mainPanel, BorderLayout.CENTER);      JSpinner defaultSpinner = new JSpinner();
      addRow("Default", defaultSpinner);      JSpinner boundedSpinner = new JSpinner(
         new SpinnerNumberModel(5, 0, 10, 0.5));
      addRow("Bounded", boundedSpinner);      String[] fonts = GraphicsEnvironment
         .getLocalGraphicsEnvironment()
         .getAvailableFontFamilyNames();      JSpinner listSpinner = new JSpinner(
         new SpinnerListModel(fonts));
      addRow("List", listSpinner);      JSpinner reverseListSpinner = new JSpinner(
         new 
            SpinnerListModel(fonts)
            {
               public Object getNextValue() 
               { 
                  return super.getPreviousValue(); 
               }
               public Object getPreviousValue() 
               { 
                  return super.getNextValue(); 
               }
            });
      addRow("Reverse List", reverseListSpinner);      JSpinner dateSpinner = new JSpinner(
         new SpinnerDateModel());
      addRow("Date", dateSpinner);      JSpinner betterDateSpinner = new JSpinner(
         new SpinnerDateModel());
      String pattern = ((SimpleDateFormat)
         DateFormat.getDateInstance()).toPattern();
      betterDateSpinner.setEditor(new JSpinner.DateEditor(
         betterDateSpinner, pattern));
      addRow("Better Date", betterDateSpinner);      JSpinner timeSpinner = new JSpinner(
         new SpinnerDateModel(
            new GregorianCalendar(2000, Calendar.JANUARY, 1,
               12, 0, 0).getTime(), null, null, Calendar.HOUR));
      addRow("Time", timeSpinner);
      
      JSpinner permSpinner = new JSpinner(
         new PermutationSpinnerModel("meat"));
      addRow("Word permutations", permSpinner);
   }   /**
      Adds a row to the main panel.
      @param labelText the label of the spinner
      @param spinner the sample spinner
   */
   public void addRow(String labelText, final JSpinner spinner)
   {
      mainPanel.add(new JLabel(labelText));
      mainPanel.add(spinner);
      final JLabel valueLabel = new JLabel();
      mainPanel.add(valueLabel);
      okButton.addActionListener(new
         ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               Object value = spinner.getValue();
               valueLabel.setText(value.toString());
            }
         });
   }   public static final int DEFAULT_WIDTH = 400;
   public static final int DEFAULT_HEIGHT = 250;     private JPanel mainPanel;
   private JButton okButton;
}/**
   A model that dynamically generates word permutations
*/
class PermutationSpinnerModel extends AbstractSpinnerModel

   /**
      Constructs the model.
      @param w the word to permute
   */
   public PermutationSpinnerModel(String w) 
   {
      word = w;
   }   public Object getValue() 
   { 
      return word; 
   }
   
   public void setValue(Object value)
   {
      if (!(value instanceof String)) 
         throw new IllegalArgumentException();
      word = (String)value;
      fireStateChanged();
   }
   
   public Object getNextValue() 
   { 
      StringBuffer buffer = new StringBuffer(word);
      for (int i = buffer.length() - 1; i > 0; i--)
      {
         if (buffer.charAt(i - 1) < buffer.charAt(i))
         {
            int j = buffer.length() - 1;
            while (buffer.charAt(i - 1) > buffer.charAt(j)) j--;
            swap(buffer, i - 1, j);
            reverse(buffer, i, buffer.length() - 1);
            return buffer.toString();
         }
      }
      reverse(buffer, 0, buffer.length() - 1);
      return buffer.toString();
   }   public Object getPreviousValue()
   {
      StringBuffer buffer = new StringBuffer(word);
      for (int i = buffer.length() - 1; i > 0; i--)
      {
         if (buffer.charAt(i - 1) > buffer.charAt(i))
         {
            int j = buffer.length() - 1;
            while (buffer.charAt(i - 1) < buffer.charAt(j)) j--;
            swap(buffer, i - 1, j);
            reverse(buffer, i, buffer.length() - 1);
            return buffer.toString();
         }
      }
      reverse(buffer, 0, buffer.length() - 1);
      return buffer.toString();
   }   private static void swap(StringBuffer buffer, int i, int j)
   {
      char temp = buffer.charAt(i);
      buffer.setCharAt(i, buffer.charAt(j));
      buffer.setCharAt(j, temp);
   }   private static void reverse(StringBuffer buffer, int i, int j)
   {
      while (i < j) { swap(buffer, i, j); i++; j--; }
   }   private String word;
}

解决方案 »

  1.   

    你应该去看看 JSpinner 这个类里面是如何实现的。
      

  2.   

    getNextValue
    public Object getNextValue()返回序列中由 getValue() 所返回的对象之后的对象。如果已达到序列结尾,则返回 null。调用此方法不影响 value。 
    此方法只委托给 model。它等效于:  getModel().getNextValue()
     
    返回:
    下一个有效值,如果不存在,则返回 nullgetPreviousValue
    public Object getPreviousValue()返回序列中由 getValue() 所返回对象之前的对象。如果已达到序列末尾,则返回 null。调用此方法不影响 value。 
    此方法只委托给 model。它等效于:  getModel().getPreviousValue()
     
    返回:
    前一个有效值;如果不存在有效值,则返回 null
      

  3.   

    2楼api里面的我看过了,但是我明白是怎么实现的取下一个或者上一个的值,还望解答。