设置JSpinnerModel时,JSpinner文本字段将被取消激活

问题描述 投票:0回答:1

我想要一个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);
   }
}
java swing jspinner
1个回答
0
投票

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

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

因此,必须扩展JSpinner.DefaultEditor以生成“MyCustomEditor”并使用

getTextField().setEditable(true);

可以使JFormattedTextField可编辑。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.