定制一个JTextField,只让输入数字


定制一个JTextField,只让输入数字

简单思路简单思路就是给控件document写个过滤器

        Document document = getDocument();
        if (document instanceof PlainDocument) {
            PlainDocument plainDocument = (PlainDocument) document;
            plainDocument.setDocumentFilter(new MyIntFilter());
        }

其中过滤器这样写本文来源:Seakee.top. 未经允许不得转载.

 class MyIntFilter extends DocumentFilter {
        @Override
        public void insertString(FilterBypass fb, int offset, String string,
                                 AttributeSet attr) throws BadLocationException {

            ....
             super.insertString(fb, offset, string, attr);

        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text,
                            AttributeSet attrs) throws BadLocationException {
            ....
                super.replace(fb, offset, length, text, attrs);


        }

        @Override
        public void remove(FilterBypass fb, int offset, int length)
                throws BadLocationException {
            ...
                super.remove(fb, offset, length);

        }
    }


但是这样有一个bug,不知道是原因。对于输入法输入,删除相应个数已存在的个数的字符。
可以重写processInputMethodEvent()解决,如下,细节省略:本文来源:Seakee.top. 未经允许不得转载.

if (!e.isConsumed()) {
            if (!isEditable()) {
                return;
            } else {
                switch (e.getID()) {
                    case InputMethodEvent.INPUT_METHOD_TEXT_CHANGED:
                        // replaceInputMethodText(e);
                        ...
                        // fall through

                    case InputMethodEvent.CARET_POSITION_CHANGED:

                        ...
                        break;
                }
            }

            e.consume();
未经允许禁止转载!!!!

发表评论

电子邮件地址不会被公开。 必填项已用*标注