只允许将数字和符号( - )输入JTextField

时间:2011-11-05 02:45:45

标签: java swing jframe jtextfield documentfilter

我正在尝试创建一个数学测验,我只希望用户能够输入数字,无论它们是负数还是正数。有没有办法这样做?我曾经想过使用正则表达式,但我听说它们使用起来很糟糕。我尝试使用keylistener,但如果用户粘贴了怎么办?我试过解析字符串得到一个整数,但负符号不起作用。

有什么想法吗?

package com.quiz.ui;

import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class SSCCE {

    private JFrame frame;

    private JPanel contentPane;

    private JTextField usernameField;

    public static void main(String[] arguments) {
        new SSCCE().construct();
    }

    public void construct() {
        frame = new JFrame("Login");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(getContentPane());
        frame.pack();
        frame.setVisible(true);
    }

    public JPanel getContentPane() {
        usernameField = new JTextField(5);
        usernameField.addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent arg0) {
                int keyCode = arg0.getKeyCode();
                if ((keyCode > 47 && keyCode < 58) || keyCode == 45) {
                    arg0.consume();
                }
                System.out.println(arg0.getKeyCode());
            }

            @Override
            public void keyReleased(KeyEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void keyTyped(KeyEvent arg0) {
                // TODO Auto-generated method stub

            }
        });

        contentPane = new JPanel(new BorderLayout());
        contentPane.add(usernameField);

        return contentPane;
    }

}

3 个答案:

答案 0 :(得分:12)

使用DocumentFilter

<强> NumberOnlyFilter.java:

import javax.swing.*;
import javax.swing.text.*;
import java.util.regex.*;
public class NumberOnlyFilter extends DocumentFilter
{

    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException
    {
        StringBuilder sb = new StringBuilder();
        sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
        sb.insert(offset, text);
        if(!containsOnlyNumbers(sb.toString())) return;
        fb.insertString(offset, text, attr);
    }
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException
    {
        StringBuilder sb = new StringBuilder();
        sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
        sb.replace(offset, offset + length, text);
        if(!containsOnlyNumbers(sb.toString())) return;
        fb.replace(offset, length, text, attr);
    }

    /**
     * This method checks if a String contains only numbers
     */
    public boolean containsOnlyNumbers(String text)
    {
        Pattern pattern = Pattern.compile("([+-]{0,1})?[\\d]*");
        Matcher matcher = pattern.matcher(text);
        boolean isMatch = matcher.matches();
        return isMatch;
    }

}

然后您就可以使用它:

((AbstractDocument)yourTxtField.getDocument()).setDocumentFilter(new NumberOnlyFilter());

答案 1 :(得分:4)

或者,请使用Validating Input考虑​​InputVerifierFormatted Text Field也可能是合适的。

答案 2 :(得分:0)

您可以使用Integer.parseInt(String s,int radix),将十进制使用10作为redix值。