我正在尝试验证文本字段,使其接受浮点或双精度值,例如 .25、0.2、111.25
它不应该接受 ...25、0.2.2 之类的值。ETC
问问题
5762 次
3 回答
4
否则(对于 plain
JTextField
)你必须用 and 创建一个DocumentFilter
自己InputMask
的InputVerifier
JFormattedTextField
例子
import java.awt.*;
import java.awt.font.TextAttribute;
import java.math.*;
import java.text.*;
import java.util.Map;
import javax.swing.*;
import javax.swing.JFormattedTextField.*;
import javax.swing.event.*;
import javax.swing.text.InternationalFormatter;
public class DocumentListenerAdapter {
public static void main(String args[]) {
JFrame frame = new JFrame("AbstractTextField Test");
final JFormattedTextField textField1 = new JFormattedTextField(new Float(10.01));
textField1.setFormatterFactory(new AbstractFormatterFactory() {
@Override
public AbstractFormatter getFormatter(JFormattedTextField tf) {
NumberFormat format = DecimalFormat.getInstance();
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.HALF_UP);
InternationalFormatter formatter = new InternationalFormatter(format);
formatter.setAllowsInvalid(false);
formatter.setMinimum(0.0);
formatter.setMaximum(1000.00);
return formatter;
}
});
final Map attributes = (new Font("Serif", Font.BOLD, 16)).getAttributes();
attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
final JFormattedTextField textField2 = new JFormattedTextField(new Float(10.01));
textField2.setFormatterFactory(new AbstractFormatterFactory() {
@Override
public AbstractFormatter getFormatter(JFormattedTextField tf) {
NumberFormat format = DecimalFormat.getInstance();
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.HALF_UP);
InternationalFormatter formatter = new InternationalFormatter(format);
formatter.setAllowsInvalid(false);
//formatter.setMinimum(0.0);
//formatter.setMaximum(1000.00);
return formatter;
}
});
textField2.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent documentEvent) {
printIt(documentEvent);
}
@Override
public void insertUpdate(DocumentEvent documentEvent) {
printIt(documentEvent);
}
@Override
public void removeUpdate(DocumentEvent documentEvent) {
printIt(documentEvent);
}
private void printIt(DocumentEvent documentEvent) {
DocumentEvent.EventType type = documentEvent.getType();
double t1a1 = (((Number) textField2.getValue()).doubleValue());
if (t1a1 > 1000) {
Runnable doRun = new Runnable() {
@Override
public void run() {
textField2.setFont(new Font(attributes));
textField2.setForeground(Color.red);
}
};
SwingUtilities.invokeLater(doRun);
} else {
Runnable doRun = new Runnable() {
@Override
public void run() {
textField2.setFont(new Font("Serif", Font.BOLD, 16));
textField2.setForeground(Color.black);
}
};
SwingUtilities.invokeLater(doRun);
}
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(textField1, BorderLayout.NORTH);
frame.add(textField2, BorderLayout.SOUTH);
frame.setVisible(true);
frame.pack();
}
private DocumentListenerAdapter() {
}
}
于 2013-04-08T09:50:09.353 回答
3
-?(\d*\.)?\d+([eE][+\-]?\d+)?|[nN]a[nN]|[iI]nf(inity)?
是我通常用于解析双打的正则表达式。
如果你不想要无穷大和 NaN,
-?(\d*\.)?\d+([eE][+\-]?\d+)?
如果你也不想要指数符号,
-?(\d*\.)?\d+
如果需要,不要忘记转义反斜杠。
于 2013-04-08T09:49:20.870 回答
3
创建一个扩展 PlainDocument 的类,然后将 jtextfield setDocument() 设置为您的新文档类。
import java.awt.Toolkit;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class DoubleDocument extends PlainDocument {
int size;
public DoubleDocument(int size) {
this.size = size;
}
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
if(str == null){
return;
}
if(getLength() + str.length() > size){
Toolkit.getDefaultToolkit().beep();
return;
}
boolean isValid = true;
for(int i = 0; i < str.length(); i++){
if(!Character.isDigit(str.charAt(i))){
if(str.charAt(i) != '.'){
isValid = false;
break;
} else {
if(this.getText(0, this.getLength()).contains(".")){
isValid = false;
break;
}
}
}
}
if(isValid){
super.insertString(offs, str, a);
} else {
Toolkit.getDefaultToolkit().beep();
}
}
}
然后像这样实现。
txtLoanAmount.setDocument(new DoubleDocument(12));
如果您不关心字段的长度,您可以选择删除 DoubleDocument 类中的大小。希望这可以帮助。
于 2015-05-21T13:04:26.660 回答