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

我正在尝试创建一个数学测验,我只希望用户能够输入数字,无论它们是负数还是正数。 有没有办法这样做? 我曾经想过使用正则表达式,但我听说它们使用起来很糟糕。 我尝试使用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; } } 

使用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()); 

或者,考虑使用InputVerifier validation输入格式化文本字段也可能是合适的。

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