我想要一个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);
}
}
设置自定义SpinnerModel后,将调用JSpinner.DefaultEditor。 Oracle
JSpinner.DefaultEditor:实现一个显示微调器值的不可编辑组件。
因此,必须扩展JSpinner.DefaultEditor以生成“MyCustomEditor”并使用
getTextField().setEditable(true);
可以使JFormattedTextField可编辑。
此外,“MyCustomEditor”是将任何FormatterFactory添加到文本字段的正确位置。
仍然,用户将能够输入无效文本,甚至是文本字段中的对象,这就是JFormattedTextField的制作方式。但是使用自定义的FormatterFactory提供了一个很好的自定义“MyFormatter”扩展AbstractFormatter,用户输入的任何无效内容永远不会到达JSpinner。