Java 仅允许JTextfield中的数字
我正在尝试实现以下要求: 仅接受JTextield中的数字,当按下非数字键时,它将不被接受 我尝试了很多东西,甚至尝试调用backspace事件来删除最后一个非数字字符。但是,无法删除在textfield中键入的值。 我试图理解文档过滤器,但发现很难实现。 如果有人帮我解决这个问题,我会很高兴。使用。下面是使用正则表达式的简单示例:Java 仅允许JTextfield中的数字,java,swing,jtextfield,Java,Swing,Jtextfield,我正在尝试实现以下要求: 仅接受JTextield中的数字,当按下非数字键时,它将不被接受 我尝试了很多东西,甚至尝试调用backspace事件来删除最后一个非数字字符。但是,无法删除在textfield中键入的值。 我试图理解文档过滤器,但发现很难实现。 如果有人帮我解决这个问题,我会很高兴。使用。下面是使用正则表达式的简单示例: JTextField field = new JTextField(10); ((AbstractDocument)field.getDocument()).set
JTextField field = new JTextField(10);
((AbstractDocument)field.getDocument()).setDocumentFilter(new DocumentFilter(){
Pattern regEx = Pattern.compile("\\d*");
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
Matcher matcher = regEx.matcher(text);
if(!matcher.matches()){
return;
}
super.replace(fb, offset, length, text, attrs);
}
});
field
是您的JTextField
,此筛选器只允许输入数字。您可以使用MaskFormatter
并将其作为Format
参数传递给JFormattedTextField
构造函数
“MaskFormatter类实现了一个格式化程序,它精确地指定字段文本的每个位置中哪些字符是有效的”——
此示例仅允许用户输入数字。我将其设置为只允许6位数字,但您可以使用更多或更少的
来更改该数字
import java.awt.BorderLayout;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.text.MaskFormatter;
public class MaskFormatterTest extends JPanel {
private JFormattedTextField formatText;
public MaskFormatterTest() {
formatText = new JFormattedTextField(createFormatter("######"));
formatText.setColumns(20);
setLayout(new BorderLayout());
add(new JLabel("Enter only numbers"), BorderLayout.NORTH);
add(formatText, BorderLayout.CENTER);
}
private MaskFormatter createFormatter(String s) {
MaskFormatter formatter = null;
try {
formatter = new MaskFormatter(s);
} catch (java.text.ParseException exc) {
System.err.println("formatter is bad: " + exc.getMessage());
System.exit(-1);
}
return formatter;
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("MaskFormatter example");
frame.add(new MaskFormatterTest());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
});
}
}
这是只创建数字jTextField的简单方法
jTextField1 = new javax.swing.JTextField();
jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
try {
long number = Long.parseLong(jTextField1.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(rootPane, "Only Numbers Allowed");
jTextField1.setText("");
}
}
});
如果按下的键不是数字,则可以添加keyListener并取消KeyTyped事件
textField.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent evt) {
if (!Character.isDigit(evt.getKeyChar())) {
evt.consume();
}
}
});
使用JFormattedTextField:。如何使用:复制。请参见使用一个好奇的例子,重写
replace
和insertString
之间有什么区别?我不太熟悉DocumnetFilter
,但就方法的名称而言,insertString
是否更适合这种情况?启蒙我:)“它还覆盖replace方法,用户粘贴新文本时最有可能调用该方法”。这是您链接到的教程中的内容。这听起来像是replace
更适合粘贴文本。我错了吗?同样来自文本,“insertString方法,每次将文本插入文档时都会调用它。”@peeskilletinsertString(…)
仅当您直接将文本插入文档时才会调用,如nextfield.getDocument().insertString(…)代码>。因此,您需要重写replace()
方法。由于这些糟糕的变量名,仍然无法升级投票。arg0,arg1。。。对任何查看代码的人来说都毫无意义。谢谢你的回答。。但是alex2410发布的代码正如我所预料的那样工作。。在您的代码中,我无法在两者之间插入值,即如果我使用DELETE键擦除数字,则会有一个空格,其中包含两位数字。。否则,您的也可以正常工作。这似乎有点滥用JFormattedTextField。此类提供了一种方法来改变输入文本的表示形式,而不是强制输入文本符合格式/字符集-尽管它允许您在显示解析失败时拒绝输入。公认的答案更为正确,因为它以预期的方式使用API。