我知道这已被多次询问和回答,但我仍然无法得到我真正需要的答案。希望这次,有人可以帮助我,我提前感谢你。 :)
这是我想要的程序,我希望用户限制只输入数字。每当他们输入信件和其他信息时,都会有一条提示信息。我可以这样做,有一个字母和其他字符的提示信息,但输入的值仍然存在,我希望它被清除。
请参阅我的代码。
private void txtQty1KeyTyped(java.awt.event.KeyEvent evt) {
txtQty1.addKeyListener(new KeyAdapter() {});
char char_input = evt.getKeyChar();
if (((char_input < '0') || (char_input > '9')) && (char_input != '\b'))
{
JOptionPane.showMessageDialog(this, "Number only!","Invalid Input",JOptionPane.ERROR_MESSAGE);
txtQty1.setText(" ");
}
}
虽然我清除了我的文本字段,但我输入的字符仍然显示。 任何帮助将非常感激。谢谢! :)
答案 0 :(得分:4)
您需要创建DocumentFilter类的子类,并使用正则表达式匹配每个插入的字符串/字符(如果它们是否为数字)并相应地执行操作。
以下是此工作的完整工作示例代码。感谢@camickr指出使用DocumentFilter比扩展JTextField以获得相同结果的旧方法更新。
import java.awt.BorderLayout;
import java.util.regex.Pattern;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class TestDocumentFilter {
public static void main(String... args) {
new TestDocumentFilter();
}
public TestDocumentFilter() {
JTextField textField = new JTextField(10);
((AbstractDocument) textField.getDocument()).setDocumentFilter(new CustomDocumentFilter());
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout(5, 5));
frame.getContentPane().add(textField, BorderLayout.NORTH);
frame.setSize(400, 200);
frame.setVisible(true);
}
private class CustomDocumentFilter extends DocumentFilter {
private Pattern regexCheck = Pattern.compile("[0-9]+");
@Override
public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) throws BadLocationException {
if (str == null) {
return;
}
if (regexCheck.matcher(str).matches()) {
super.insertString(fb, offs, str, a);
}
}
@Override
public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attrs)
throws BadLocationException {
if (str == null) {
return;
}
if (regexCheck.matcher(str).matches()) {
fb.replace(offset, length, str, attrs);
}
}
}
}
答案 1 :(得分:1)
在代码中添加行evt.consume()
,如下所示:
JOptionPane.showMessageDialog(this, "Number only!","Invalid Input",JOptionPane.ERROR_MESSAGE);
txtQty1.setText(" ");
evt.consume(); //consume the key type event
详细信息http://docs.oracle.com/javase/7/docs/api/java/awt/event/InputEvent.html#consume()
要禁用在txtQty1
文字字段中粘贴错误输入,您可以使用caretUpdate
事件,如下所示:
注意:如果您使用Netbeans GUI表单,只需创建caretUpdate事件。
private void txtQty1CaretUpdate(javax.swing.event.CaretEvent evt) {
String text = txtQty1.getText();
if(text != null) {
if(!text.matches("[0-9]*")) {
txtQty1.setText(" ");
}
}
}