Текстовое поле JSpinner деактивируется при настройке JSpinnerModel - PullRequest
0 голосов
/ 05 марта 2019

Мне нужен 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 голосов
/ 05 марта 2019

Когда установлен пользовательский SpinnerModel, вызывается JSpinner.DefaultEditor. Oracle

JSpinner.DefaultEditor: Реализует не редактируемый компонент, который отображает значение счетчика.

Поэтому JSpinner.DefaultEditor должен быть расширен для создания «MyCustomEditor» и с

getTextField().setEditable(true);

JFormattedTextField можно сделать редактируемым.

Также «MyCustomEditor» является правильным местом для добавления любого FormatterFactory в текстовое поле.

Тем не менее, пользователь сможет вводить недопустимый текст, даже объекты, в текстовое поле, как было сделано JFormattedTextField. Но с помощью пользовательского FormatterFactory, который предоставляет хороший пользовательский «MyFormatter», расширяет AbstractFormatter любой недопустимый контент, введенный пользователем, никогда не попадет в JSpinner.

...