JTextField - 如何确定可以键入哪些值

JTextField - how to determine which values can be typed

我开发了一些计算器,所以在JTextField上面只能有一些字符。
实现这一目标的最佳方式是什么?

假设我有这个char[] values = 0,1,2,3,4,5,6,7,8,9,+,-,*,/,(,),.,,这些是用户可以输入的值。

使用 JFormattedTextField。您可以将 MaskFormattersetValidCharacters(...) 方法一起使用,并指定包含有效字符的字符串。

阅读 Using a MaskFormatter 上的 Swing 教程部分了解更多信息。

或者另一种方法是使用带有 DocumentFilter 的 JTextField。有关详细信息,请阅读 Implementing a DocumentFilter 上的 Swing 教程。

像你这样的问题已经有好几个解决了:

Filter the user's keyboard input into JTextField (swing)

No blanks in JTextField

根据这些,您应该使用 DocumentFilter 或 JFormattedTextField。

最终我设法创建了自己的 JTextField,它是这样实现的:

public class MyTextField extends JTextField {

    //final value for maximum characters
    private final int MAX_CHARS = 20;

    /**
     * A regex value which helps us to validate which values the user can enter in the input
     */
    private final String REGEX = "^[\d\+\/\*\.\- \(\)]*$";

    public MyTextField(){

        //getting our text as a document
        AbstractDocument document = (AbstractDocument) this.getDocument();        

        /**
         * setting a DocumentFilter which helps us to have only the characters we need
         */
        document.setDocumentFilter(new DocumentFilter() {
            public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {

                String text = fb.getDocument().getText(0, fb.getDocument().getLength());
                text += str;

                if ((fb.getDocument().getLength() + str.length() - length) <= MAX_CHARS && text.matches(REGEX)){
                    super.replace(fb, offs, length, str, a);
                } 
            }

            public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) throws BadLocationException {

                String text = fb.getDocument().getText(0, fb.getDocument().getLength());
                text += str;

                if ((fb.getDocument().getLength() + str.length()) <= MAX_CHARS && text.matches(REGEX)){
                    super.insertString(fb, offs, str, a);
                }
            }
        });
    }

}