1

以下は、65535未満の値のみを受け入れるように動作させようとしたKeyAdapterです。実際に必要な場所から1キーストローク遅れているように見えます。たとえば、「55」と入力すると、System.out.printlnは「5」を生成し、「3298」を実行すると「329」を生成します。

// Allows for unsigned short values only
KeyAdapter unsignedShortAdapter = new KeyAdapter() {

    public void keyTyped(KeyEvent e) {
        char c = e.getKeyChar();
        int tempInt = 0;
        JTextField temp = null;

        if (!((Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE)))) {
            getToolkit().beep();
            e.consume();
        }
        try {
            temp = (JTextField) e.getSource();
            System.out.println(temp.getText());
            tempInt = (Integer.parseInt(temp.getText().toString()));
        } catch (NumberFormatException e1) {

        } finally {
            if (tempInt > (Short.MAX_VALUE * 2)) {
                 getToolkit().beep();
                 e.consume();
                temp.setText(temp.getText().substring(0, temp.getText().length() - 1));

                invalidate();
            }

        }
    }

};
4

1 に答える 1

5

したがって、あなたが見つけたの代わりに、KeyListener信頼性が低く、多くの厄介な副作用(およびドキュメントミューテーションの例外:Pの可能性)を引き起こす可能性がありますDocumentFilter

public class ShortFilter extends DocumentFilter {

    protected boolean valid(String text) {


        boolean valid = true;
        for (char check : text.toCharArray()) {

            if (!Character.isDigit(check)) {

                valid = false;
                break;

            }

        }

        if (valid) {

            int iValue = Integer.parseInt(text);

            valid = iValue <= (Short.MAX_VALUE * 2);

        }

        return valid;

    }

    @Override
    public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {

        StringBuilder sb = new StringBuilder(fb.getDocument().getText(0, fb.getDocument().getLength()));
        sb.insert(offset, text);

        if (valid(sb.toString())) {

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

        }

    }

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

        if (length > 0) {

            StringBuilder sb = new StringBuilder(fb.getDocument().getText(0, fb.getDocument().getLength()));

            sb.delete(offset, length);
            sb.insert(offset, text);

            if (valid(sb.toString())) {

                super.replace(fb, offset, length, text, attrs);

            }

        } else {

            insertString(fb, offset, text, attrs);

        }

    }
}

これをフィールドのドキュメントに適用する必要があります

((AbstractDocument) field.getDocument()).setDocumentFilter(new ShortFilter());

チェックアウトします

詳細については

10進数の包含の更新

基本的に、小数を含めることを許可する場合は、validメソッドで文字を許可する必要があります。

また、現在のドキュメントの内容を確認する必要があります

StringBuilder sb = new StringBuilder(fb.getDocument().getText(0, fb.getDocument().getLength()));

// Update the StringBuilder as per noraml
// Check valid as per normal

if (text.contains(".") && sb.contains(".")) {
  // already have decimal place
} else {
  // Business as usual...
}
于 2012-08-11T22:29:17.477 に答える