Regex para DocumentFilter para que coincida con todos los números decimales pero también con solo un decimal al final

Qestion First: Necesito regex para que coincida111 o111. o111.111 (solo números aritrarty) para unDocumentFilter. Necesito que el usuario pueda ingresar111. con undecimal y nada después Parece que no puedo hacerlo bien.

Todas las expresiones regulares que encuentro coinciden solotodas números decimales, es decir

12343.5565
32.434
32

Me gusta esta expresión regular

^[0-9]*(\\.)?[0-9]+$

El problema es que necesito la expresión regular para unDocumentFilter entonces la entrada solo puede ser números con / sin punto decimal.Pero el problema es que también debe coincidir

1223.

Entonces el usuario puede ingresar el decimal en el campo de texto. Así que básicamente necesito regex para que coincida

11111         // all integer
11111.        // all integers with one decimal point and nothing after
11111.1111    // all decimal numbers

El patrón que tengo hasta ahora es el de arriba. Aquí hay un programa de prueba (para usuarios de Java)

El patrón se puede ingresar en esta línea

 Pattern regEx = Pattern.compile("^[0-9]*(\\.)?[0-9]+$");

Si la expresión regular se ajusta a la factura, podrá ingresar111 o111. o111.111.

Ejecutarlo :)

import java.awt.GridBagLayout;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.text.*;

public class DocumentFilterRegex {

    JTextField field = new JTextField(20);

    public DocumentFilterRegex() {

        ((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentFilter() {
            Pattern regEx = Pattern.compile("^[0-9]*(\\.)?[0-9]+$");

            @Override
            public void insertString(DocumentFilter.FilterBypass fb, int off, String str, AttributeSet attr)
                    throws BadLocationException {
                Matcher matcher = regEx.matcher(str);
                if (!matcher.matches()) {
                    return;
                }
                super.insertString(fb, off, str, attr);
            }

            @Override
            public void replace(DocumentFilter.FilterBypass fb, int off, int len, String str, AttributeSet attr)
                    throws BadLocationException {
                Matcher matcher = regEx.matcher(str);
                if (!matcher.matches()) {
                    return;
                }
                super.replace(fb, off, len, str, attr);
            }
        });

        JFrame frame = new JFrame("Regex Filter");
        frame.setLayout(new GridBagLayout());
        frame.add(field);
        frame.setSize(300, 150);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new DocumentFilterRegex();
            }
        });
    }
}

EDITAR:

Mi suposición original de que elstr Pasé a los métodos el documento completo String, así que estaba confundido acerca de por qué las respuestas no funcionaron. Me di cuenta de que solo se pasó la parte intentada insertada de la Cadena.

Dicho esto, las respuestas funcionan perfectas, si obtiene la Cadena de documento completa de FilterBypass y verifica la expresión regular contra la Cadena de documento completa. Algo como

@Override
public void insertString(DocumentFilter.FilterBypass fb, int off, String str, AttributeSet attr)
        throws BadLocationException {

    String text = fb.getDocument().getText(0, fb.getDocument().getLength() - 1);
    Matcher matcher = regEx.matcher(text);
    if (!matcher.matches()) {
        return;
    }
    super.insertString(fb, off, str, attr);
}