JTextField - 如何确定可以键入的值

时间:2015-01-28 15:27:00

标签: java swing jtextfield

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

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

3 个答案:

答案 0 :(得分:3)

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

阅读Using a MaskFormatter上的Swing教程中的部分以获取更多信息。

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

答案 1 :(得分:2)

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

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

No blanks in JTextField

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

答案 2 :(得分:2)

最终我设法创建了我自己的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);
                }
            }
        });
    }

}