如何在JavaSwing中验证只接受浮点/十进制值的jtextfield?

如何在JavaSwing中验证只接受浮点/十进制值的jtextfield?,java,swing,validation,double,jtextfield,Java,Swing,Validation,Double,Jtextfield,我试图验证文本字段,使其接受浮点值或双精度值,如.25、0.2、111.25 它不应该接受像…25,0.2.2这样的值。etc-?(\d*\)?\d+([eE][+\-]?\d+)?[nN]a[nN][iI]nf(inity)?是我通常用于解析双精度的正则表达式 如果你不想要无穷大和南 -?(\d*\)?\d+([eE][+\-]?\d+) 如果你也不想要指数符号 -(\d*\)?\d+ 如果需要,请不要忘记避开反斜杠。-?(\d*\)?\d+([eE][+\-]?\d+)?[nN]a[nN][

我试图验证文本字段,使其接受浮点值或双精度值,如.25、0.2、111.25
它不应该接受像…25,0.2.2这样的值。etc

-?(\d*\)?\d+([eE][+\-]?\d+)?[nN]a[nN][iI]nf(inity)?
是我通常用于解析双精度的正则表达式

如果你不想要无穷大和南

-?(\d*\)?\d+([eE][+\-]?\d+)

如果你也不想要指数符号

-(\d*\)?\d+

如果需要,请不要忘记避开反斜杠。

-?(\d*\)?\d+([eE][+\-]?\d+)?[nN]a[nN][iI]nf(inity)?
是我通常用于解析双精度的正则表达式

如果你不想要无穷大和南

-?(\d*\)?\d+([eE][+\-]?\d+)

如果你也不想要指数符号

-(\d*\)?\d+

如果需要,不要忘记避开反斜杠。

  • 使用

  • 否则(对于普通
    JTextField
    ),您必须使用
    InputMask
    InputVerifier
    创建自己的
    DocumentFilter

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() {
    }
}

  • 使用

  • 否则(对于普通
    JTextField
    ),您必须使用
    InputMask
    InputVerifier
    创建自己的
    DocumentFilter

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() {
    }
}


创建一个扩展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();
        }
    }

}

如果不关心字段的长度,可以选择删除DoubleDocument类中的大小。希望这有帮助。

创建一个扩展PlainDocument的类,然后将jtextfield setDocument()设置为新的document类

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();
        }
    }

}

如果不关心字段的长度,可以选择删除DoubleDocument类中的大小。希望这有帮助。

重复。与数值相同(如图所示),但使用另一个
java.text.Format
可能的重复项,但对于表单的验证,我没有得到它,仅使用jtextfield.duplicate。与数字值相同(如图所示),但使用另一个
java.text.Format
可能的重复项,但为了验证表单,我没有得到它,仅使用jtextfield。如何使用InputMask和InputVerifier为普通jtextfield创建自己的DocumentFilter?使用数字格式的JFormattedTextField有什么问题?如何使用InputMask和InputVerifier为普通jtextfield创建自己的DocumentFilter?使用数字格式的JFormattedTextField有什么问题Formatter@Chaitanya加达姆我正在python解释器中测试正则表达式,它对我来说很好。你知道在java swing中这样做吗?@Chaitanya Gadam使用调试器。匹配的字符串的调用是否完全符合您的预期?简化问题。编写一个测试用例,在已知字符串上尝试正则表达式。它在你期望的时候有效,而在你不期望的时候无效吗?为什么?@Chaitanya Gadam我正在python解释器中测试正则表达式,它对我来说很好。你知道在java swing中这样做吗?@Chaitanya Gadam使用调试器。匹配的字符串的调用是否完全符合您的预期?简化问题。编写一个测试用例,在已知字符串上尝试正则表达式。它在你期望的时候有效,而在你不期望的时候无效吗?为什么?