有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有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) 个答案