Double的JFormattedTextField仍然需要字符[重复]
Posted
技术标签:
【中文标题】Double的JFormattedTextField仍然需要字符[重复]【英文标题】:JFormattedTextField for Double still takes characters [duplicate] 【发布时间】:2013-08-07 20:15:01 【问题描述】:我有一个 JFormattedTextField,用户可以在其中输入价格,我有这个,但如果我输入一个字符,它无论如何都会让我输入。我需要此文本字段仅从键盘读取数字或 , 如果它是字符则忽略。我应该如何更改它才能使其正常工作?
JFormattedTextField formattedTextField = new JFormattedTextField();
formattedTextField.setBounds(25, 330, 56, 20);
contentPanel.add(formattedTextField);
formattedTextField.setValue(new Double(10.0));
【问题讨论】:
这篇文章应该对你有帮助:***.com/questions/1313390/… 【参考方案1】:你需要设置一个Formatter:
NumberFormat f = NumberFormat.getNumberInstance();
JFormattedTextField field = new JFormattedTextField(f);
看一看:Format 和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);
【讨论】:
还是不行 为什么要将DocumentFilter
与JFormattedTextField
结合使用。在这种情况下JFormattedTextField
的附加值是多少?
只是为了表明这个 TextField 有一个格式化的内容,但你是对的,这里错过了 JFormattedTextField 的全部目的。【参考方案2】:
JFormattedTextField
可用于多种用途,也可用于过滤日期或电话号码。您要么需要将 NumberFormater
设置为 TextField
,要么使用 DocumentFilter(也仅适用于 JTextField)。
检查此代码 sn-p,这就是您使用 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();
【讨论】:
以上是关于Double的JFormattedTextField仍然需要字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章
java里double类和double的区分 是否在于一个是大写一个是小写?
关于double和float的包装类Double和Float代码如下 Double d1 = 1.0;Double d2 = 1.0;
C#:double[][] 和 double[,] [重复]