用于Double的JFormattedTextField仍然需要字符

我有一个JFormattedTextField用户输入价格,我有这个,但如果我输入一个字符,它还是会让我。 我需要这个文本字段只读取数字或键盘,并忽略它是否为char。 我应该如何更改才能使其正常工作?

JFormattedTextField formattedTextField = new JFormattedTextField(); formattedTextField.setBounds(25, 330, 56, 20); contentPanel.add(formattedTextField); formattedTextField.setValue(new Double(10.0)); 

你需要设置一个Formatter:

 NumberFormat f = NumberFormat.getNumberInstance(); JFormattedTextField field = new JFormattedTextField(f); 

看一看:
格式

的NumberFormat

然后尝试这个:

 PlainDocument doc = new PlainDocument(); doc.setDocumentFilter(new DocumentFilter() { @Override public void insertString(FilterBypass fb, int off, String str, AttributeSet attr) throws BadLocationException { fb.insertString(off, str.replaceAll("\\D++", ""), attr); // remove non-digits } @Override public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr) throws BadLocationException { fb.replace(off, len, str.replaceAll("\\D++", ""), attr); // remove non-digits } }); JFormattedTextField field = new JFormattedTextField(); field.setDocument(doc); 

JFormattedTextField可以用于很多事情,它也可以用来过滤日期或电话号码。 您需要将NumberFormater设置为TextField或者使用DocumentFilter(仅适用于JTextField)。

检查此代码段,使用DocumentFilter,只允许JTextField中的数字作为最有效的方式:

 import java.awt.*; import javax.swing.*; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; import javax.swing.text.DocumentFilter.FilterBypass; public class InputInteger { private JTextField tField; private MyDocumentFilter documentFilter; private void displayGUI() { JFrame frame = new JFrame("Input Integer Example"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JPanel contentPane = new JPanel(); contentPane.setBorder( BorderFactory.createEmptyBorder(5, 5, 5, 5)); tField = new JTextField(10); ((AbstractDocument)tField.getDocument()).setDocumentFilter( new MyDocumentFilter()); contentPane.add(tField); frame.setContentPane(contentPane); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { new InputInteger().displayGUI(); } }; EventQueue.invokeLater(runnable); } } class MyDocumentFilter extends DocumentFilter { @Override public void insertString(DocumentFilter.FilterBypass fp , int offset, String string, AttributeSet aset) throws BadLocationException { int len = string.length(); boolean isValidInteger = true; for (int i = 0; i < len; i++) { if (!Character.isDigit(string.charAt(i))) { isValidInteger = false; break; } } if (isValidInteger) super.insertString(fp, offset, string, aset); else Toolkit.getDefaultToolkit().beep(); } @Override public void replace(DocumentFilter.FilterBypass fp, int offset , int length, String string, AttributeSet aset) throws BadLocationException { int len = string.length(); boolean isValidInteger = true; for (int i = 0; i < len; i++) { if (!Character.isDigit(string.charAt(i))) { isValidInteger = false; break; } } if (isValidInteger) super.replace(fp, offset, length, string, aset); else Toolkit.getDefaultToolkit().beep(); } }