带有SpinnerNumberModel的java JSpinner:是否对输入的数字进行验证?
我们的目标是拥有这样一个JSpinner:
SpinnerNumberModel(1650, 1650, 2100, 10);
setEditable(true);
setFocusable(true);
它还应该只接受数值在1650-2100范围内。如果该值不在此范围内,请设置默认值(1650)。目前,我的代码只允许我输入4位数字,但它们超出了范围。我读过很多类似的问题,但我没有在Jspinner中找到一个限制输入数量的主题
public class MySpinner extends JSpinner {
int defValue;
int minimum;
int maximum;
int stepSize;
public MySpinner(int defValue, int minimum, int maximum, int stepSize) {
this.defValue = defValue; //1650
this.minimum = minimum; //1650
this.maximum = maximum; //2100
this.stepSize = stepSize; //10
SpinnerNumberModel spinnerNumberModel = new SpinnerNumberModel(defValue, minimum, maximum, stepSize);
setModel(spinnerNumberModel);
setBorder(new EmptyBorder(0, 0, 0, 0));
JSpinner.NumberEditor numberEditor = ((JSpinner.NumberEditor) this.getEditor());
numberEditor.getTextField().setEnabled(true);
numberEditor.getTextField().setEditable(true);
numberEditor.getFormat().setMaximumFractionDigits(4);
JFormattedTextField textField = numberEditor.getTextField();
((NumberFormatter) textField.getFormatter()).setAllowsInvalid(false);
NumberFormatter formatter = (NumberFormatter) textField.getFormatter();
DecimalFormat decimalFormat = new DecimalFormat("0");
formatter.setFormat(decimalFormat);
final Document jsDoc = numberEditor.getTextField().getDocument();
if (jsDoc instanceof PlainDocument) {
AbstractDocument doc = new PlainDocument() {
private static final long serialVersionUID = 1L;
@Override
public void setDocumentFilter(DocumentFilter filter) {
if (filter instanceof MyDocumentFilter) {
super.setDocumentFilter(filter);
}
}
};
doc.setDocumentFilter(new MyDocumentFilter());
numberEditor.getTextField().setDocument(doc);
}
}
public static class MyDocumentFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
if (stringContainsOnlyDigits(string)) {
super.insertString(fb, offset, string, attr);
}
}
@Override
public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
super.remove(fb, offset, length);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
int currentLength = fb.getDocument().getLength();
int overLimit = (currentLength + text.length()) - 4 - length;
if (overLimit > 0) {
text = text.substring(0, text.length() - overLimit);
}
if (stringContainsOnlyDigits(text)) {
super.replace(fb, offset, length, text, attrs);
}
}
private boolean stringContainsOnlyDigits(String text) {
for (int i = 0; i < text.length(); i++) {
if (!Character.isDigit(text.charAt(i))) {
return false;
}
}
return true;
}
}
}
也许我的代码中有很多不必要的东西。我很乐意接受任何建议。提前谢谢
共 (0) 个答案