我正在尝试实施以下要求:
仅接受JTextield中的数字,当按下非数字键时,将不接受它。
我尝试了很多东西,甚至试图调用退格事件来删除最后一个字符,如果它是非数字的话。但是,无法删除文本字段中键入的值。 我试图了解文档过滤器,但发现它很难实现。 如果有人帮助我解决问题,我将很高兴。
答案 0 :(得分:3)
使用DocumentFilter
。以下是正则表达式的简单示例:
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
,此过滤器只允许输入数字。
答案 1 :(得分:2)
您可以使用MaskFormatter
并将其作为Format
参数传递给JFormattedTextField
构造函数。
" MaskFormatter类实现了一个格式化程序,可以准确指定字段" - MaskFormatter tutorial
此示例仅允许用户输入数字。我将其设置为仅允许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);
}
});
}
}
答案 2 :(得分:0)
这是仅创建数字的简单方法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("");
}
}
});
答案 3 :(得分:-1)
如果按下的键不是数字,您可以添加一个 keyListener 并取消 KeyTyped 事件。
textField.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent evt) {
if (!Character.isDigit(evt.getKeyChar())) {
evt.consume();
}
}
});