0

ユーザーの入力に制限を設定する方法は、ユーザーが2つまたは4つの整数のみを入力できることを意味します。

コード:

 JLabel dateD = new JLabel("| Date  Day:");
 dateD.setBounds(170,270, 120, 25);

 dateDD = new JTextField();
 dateDD.setBounds(235,270, 20, 25);
4

2 に答える 2

1

を使用しDocumentFilterて整理し、次のようにフィルターを作成します:-

class MaximumCharacters extends DocumentFilter {

        private int maxLength;

        public MaximumCharacters() {
            maxLength = 10; // The number of characters allowed
        }

        @Override
        public void insertString(FilterBypass fb, int offset, String string,
                AttributeSet attr) throws BadLocationException {
            if (maxLength > 0
                    && fb.getDocument().getLength() + string.length() <= maxLength) {
                super.insertString(fb, offset, string, attr);
            }
        }

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

            if ((fb.getDocument().getLength() + text.length() - length) <= maxLength)
                super.replace(fb, offset, length, text, attrs);
        }
    }

次に、次のようにコンポーネントに設定DocumentFilterしますJTextField:-

((AbstractDocument) dateDD.getDocument()).setDocumentFilter(new MaximumCharacters());
于 2013-03-26T18:13:35.287 に答える
0

上記の回答について、以下は上記の状況に対処するために作成したユーティリティメソッドです-

    /**
     * Method installNumericMaximumCharacters.
     * 
     * @param document
     *            AbstractDocument
     * @param numberofChars
     *            int
     */
    public static void installNumericMaximumCharacters(
            AbstractDocument document, final int numberofChars) {
        document.setDocumentFilter(new DocumentFilter() {
            @Override
            public void insertString(FilterBypass fb, int offset,
                    String string, AttributeSet attr)
                    throws BadLocationException {
                try {
                    if (string.equals(".")
                            && !fb.getDocument()
                                    .getText(0, fb.getDocument().getLength())
                                    .contains(".")) {
                        super.insertString(fb, offset, string, attr);
                        return;
                    }
                    Double.parseDouble(string);
                    if (fb.getDocument().getLength() + string.length() <= numberofChars) {
                        super.insertString(fb, offset, string, attr);
                    } else {
                        Toolkit.getDefaultToolkit().beep();
                    }
                } catch (Exception e) {
                    Toolkit.getDefaultToolkit().beep();
                }
            }

            @Override
            public void replace(FilterBypass fb, int offset, int length,
                    String text, AttributeSet attrs)
                    throws BadLocationException {
                try {
                    if (text.equals(".")
                            && !fb.getDocument()
                                    .getText(0, fb.getDocument().getLength())
                                    .contains(".")) {
                        super.insertString(fb, offset, text, attrs);
                        return;
                    }
                    Double.parseDouble(text);
                    int l = fb.getDocument().getLength() - length
                            + text.length();
                    if (length > 0) {
                        fb.getDocument().remove(offset, length);
                    }
                    if (l <= numberofChars) {
                        super.insertString(fb, offset, text, attrs);

                    } else {
                        Toolkit.getDefaultToolkit().beep();
                    }
                } catch (Exception e) {
                    Toolkit.getDefaultToolkit().beep();
                }
            }
        });
    }

この方法は自明です。で変更が発生Documentするたびに、 が呼び出されDocumentFilterます。setText()同じことはできないことに注意してくださいDocumentFilterBypassオブジェクトを使用する必要があります。

于 2013-03-26T18:39:37.247 に答える