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