允许textfield仅输入数字[Java]
我知道这个问题已经被问过很多次了,但是我仍然不能得到我真正需要的答案。希望这次有人能帮助我,我提前向你表示感谢。:) 这就是我希望在我的程序中,我希望用户只输入数字。每当他们输入字母和其他内容时,都会出现提示信息。我可以这样做,有一个字母和其他字符提示消息,但输入值仍然保留,我希望它被清除 请看我的密码允许textfield仅输入数字[Java],java,jtextfield,Java,Jtextfield,我知道这个问题已经被问过很多次了,但是我仍然不能得到我真正需要的答案。希望这次有人能帮助我,我提前向你表示感谢。:) 这就是我希望在我的程序中,我希望用户只输入数字。每当他们输入字母和其他内容时,都会出现提示信息。我可以这样做,有一个字母和其他字符提示消息,但输入值仍然保留,我希望它被清除 请看我的密码 private void txtQty1KeyTyped(java.awt.event.KeyEvent evt) {
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(" ");
}
}
private void txtQty1KeyTyped(java.awt.event.KeyEvent evt){
addKeyListener(新的KeyAdapter(){});
char char_input=evt.getKeyChar();
如果(((字符输入<'0')| |(字符输入>'9'))&&(字符输入!='\b'))
{
JOptionPane.showMessageDialog(此“仅限数字!”,“无效输入”,JOptionPane.ERROR_消息);
txtQty1.setText(“”);
}
}
虽然我清除了文本字段,但输入的字符仍会出现。
任何帮助都将不胜感激。谢谢!:) 在代码中添加行evt.consume()
,如下所示:
JOptionPane.showMessageDialog(this, "Number only!","Invalid Input",JOptionPane.ERROR_MESSAGE);
txtQty1.setText(" ");
evt.consume(); //consume the key type event
详述
要禁用在
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(" ");
}
}
}
在代码中添加行evt.consume()
,如下所示:
JOptionPane.showMessageDialog(this, "Number only!","Invalid Input",JOptionPane.ERROR_MESSAGE);
txtQty1.setText(" ");
evt.consume(); //consume the key type event
详述
要禁用在
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(" ");
}
}
}
您需要创建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);
}
}
}
}
您需要创建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);
}
}
}
}
evt.consume();应该使用
DocumentFilter
,如中所示。OP用一个工作过滤器更新了问题。evt.consume();应该使用DocumentFilter
,如中所示。OP用一个有效的过滤器更新了这个问题。您好@developerBuwan,非常感谢。我已经得到了我所需要的。:)@nhix,不要使用KeyListener。这不是解决问题的办法。例如,尝试将无效文本字符串粘贴到文本字段中。您的编辑无效。@camickr谢谢!我试过了,你是对的。我应该使用什么事件?@camickr抱歉我忽略了。谢谢!:)我同意这不是一个好答案,它永远不会被黑客攻击。下面是正确的安全和“swingish”方式(Document或DocumentFilter)Hi@developerBuwan,非常感谢。我已经得到了我所需要的。:)@nhix,不要使用KeyListener。这不是解决问题的办法。例如,尝试将无效文本字符串粘贴到文本字段中。您的编辑无效。@camickr谢谢!我试过了,你是对的。我应该使用什么事件?@camickr抱歉我忽略了。谢谢!:)我同意这不是一个好答案,它永远不会被黑客攻击。下面是正确的安全和“swingish”方法(文档或文档过滤器)。较新的方法是使用DocumentFilter
,而不是创建自定义文档。DocumentFilter
可以添加到任何AbstractDocument
@camickr哦,这对我来说是新的,谢谢。我试试看。的确,我很久以前就使用定制的jtextfield:)例如,请参阅。示例过滤器可用于JTextField、JTextArea或JTextPane。不需要不同的类来扩展不同的文档。已更新答案以使用DocumentFilter。你知道这和以前的方法很相似,只是你只是把1类的子类化了,而不是把2类的子类化了。谢谢你@george_h和camickr。即使我尝试粘贴文本,我也尝试过,而且效果很好。较新的方法是使用DocumentFilter
,而不是创建自定义文档。DocumentFilter
可以添加到任何AbstractDocument
@camickr哦,这对我来说是新的,谢谢。我试试看。的确,我很久以前就使用定制的jtextfield:)例如,请参阅。示例过滤器可用于JTextField、JTextArea或JTextPane。不需要不同的类来扩展不同的文档。已更新答案以使用DocumentFilter。你知道这和以前的方法很相似,只是你只是把1类的子类化了,而不是把2类的子类化了。谢谢你@george_h和camickr。我已经试过了,而且真的很好,即使我试着粘贴文本。