设置JSpinnerModel时JSpinner文本字段被停用

时间:2019-03-05 16:06:59

标签: java swing jspinner

我想要一个JSpinner,该文本字段中只能输入整数,也可以使用“旋转按钮”选择数字。

因此,我写了两节课:

1)NumberCodeFormatterFactory extends DefaultFormatterFactory
 2)IntegerSpinnerModel extends AbstractSpinnerModel

现在,当我将IntegerSpinnerModel设置为JSpinner时,JSpinner的文本字段将被停用,因此不再可以在其中键入任何值。但是旋转按钮可以正常工作。

这是我的IntegerSpinnerModel:

import javax.swing.AbstractSpinnerModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class IntegerSpinnerModel extends AbstractSpinnerModel
{
   private static final long serialVersionUID = -7145780527051124946L;

   int number = 0;
   int minimum = 0;
   int maximum = 0;

   public Object getValue()
   {
      return String.valueOf(number);
   }

  public void setValue(Object value)
   {
      if (value instanceof Integer)
      {
         int input = (int) value;
         if (minimum <= input && maximum >= input)
         {
            this.number = input;
            this.fireChangeEvent();
         }
     }

      if (value instanceof String)
      {
         try
         {
            int input = Integer.valueOf((String) value);
            if (minimum <= input && maximum >= input)
            {
               this.number = input;
               this.fireChangeEvent();
            }
         }
         catch (Exception e)
         {

         }
      }
   }

   public void setMinimum(int minimum)
   {
      this.minimum = minimum;
   }

  public void setMaximum(int maximum)
   {
      this.maximum = maximum;
   }

   private void fireChangeEvent()
   {
      for (ChangeListener l : super.getChangeListeners())
     {
         l.stateChanged(new ChangeEvent(this));
      }
   }

   public Object getNextValue()
   {
      int next = number + 1;
     if (minimum <= next && maximum >= next)
      {
         this.number = next;
         this.fireChangeEvent();
      }
      return String.valueOf(next);
   }

   public Object getPreviousValue()
   {
      int previous = number - 1;
      if (minimum <= previous && maximum >= previous)
      {
         this.number = previous;
          this.fireChangeEvent();
      }
      return String.valueOf(previous);
   }
}

1 个答案:

答案 0 :(得分:0)

设置了自定义SpinnerModel时,将调用JSpinner.DefaultEditor。 Oracle

  

JSpinner.DefaultEditor:实现一个不可编辑的组件,用于显示微调器的值。

因此,必须将JSpinner.DefaultEditor扩展为“ MyCustomEditor”,并使用

getTextField().setEditable(true);

JFormattedTextField可设置为可编辑的。

“ MyCustomEditor”也是将任何FormatterFactory添加到文本字段的正确位置。

仍然,用户将能够在文本字段中输入无效的文本,甚至包括对象,这就是JFormattedTextField的创建方式。但是,使用提供良好自定义“ MyFormatter”的自定义FormatterFactory扩展了AbstractFormatter,用户输入的任何无效内容将永远不会到达JSpinner。