JTextField nur Zahleneingaben zulassen, eingabe sperren

MasterShredder

Aktives Mitglied
Hallo,

ich wollte in meinem EingabeTextField, nur die Eingabe von Zahlen zulassen. Bin dabei auf JFormattedTextField gestoßen. Ist dies dafür gut geeignet?
Nur wie mache ich dass dann genau? Das eigentliche JFormattetTextField Formatiert nicht, nur was für ein Objekt muss ich dafür erstellen? Und stimmt dass mit NumberFormat?

Und dann will ich noch in meinen anderen TextField's die Eingabe verbieten.
Würde dass damit auch gehen?

Java:
package Hauptprogramm;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;

public class GasPanel extends JPanel{
        
//Attribute
    private double zustandszahl = 0.94876, brennwert = 11.296, abzuege = 2236;
    private double doubEingabe, rechnungszeitraum, kwh, aktKosten, kostenOGrundg, diffVJoGrundg, diffVJaus;
    private JTextField anzRechnungszeitraum, anzKwh, diffVJ, eingabeKubik, aktRechnungsbetrag, diffVorjahrOgrundg, betragOgrundG;
    //Einheiten
    private String kwhEin = "kWh";
    private char kubikEin = '\u00B3', euroEin = '\u20AC';
    
    //GridBagContrains Objekt
    GridBagConstraints gbc = new GridBagConstraints();
    
//Konstruktor
    public GasPanel() {           
    setLayout(new GridBagLayout());               
    setPreferredSize(new Dimension(500, 300));
    gbc.insets = new Insets(2, 2, 2, 2);
    fenster();
    }
        
//Zuweisung GridBagLayout
    private void gbl(int gx, int gy, int gw, int gh) {
        gbc.gridx = gx;
        gbc.gridy = gy;
        gbc.gridwidth = gw;
        gbc.gridheight = gh;
        }
        
//Verrechnung       
    private void verrechnen() {
        //Umwandlung in kWh
        rechnungszeitraum = doubEingabe - abzuege;
        kwh = Math.round(rechnungszeitraum * zustandszahl * brennwert);
    //kWh * Preis/kWh auf Euro + Grundgebuehr - Vorjahresrechnung
        
        //Preis ohne Grundgebühr
        kostenOGrundg = Math.round(kwh * 6.39 / 100);
        diffVJoGrundg = Math.round(kostenOGrundg - 385.83);
        
        //Aktuelle Gesamtkosten
        aktKosten = Math.round(kwh * 6.39 / 100 + 123.76);
        double diffVJ = aktKosten;
        diffVJaus = Math.round(diffVJ - 385.83);
        }
        
//Fensteraufbau   
    public void    fenster() {
        
        //Differenz Vorjahr ohne Grundgebühr
        JLabel diffVJohneGrundgebuehr = new JLabel("Differenz Vorjahr ohne Grundgebühr:");
        gbc.anchor = GridBagConstraints.LINE_START;
        gbl(0, 0, 1, 1);
        add(diffVJohneGrundgebuehr, gbc);
        
        diffVorjahrOgrundg = new JTextField();
        diffVorjahrOgrundg.setPreferredSize(new Dimension(100, 20));
        diffVorjahrOgrundg.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 0, 1, 1);
        add(diffVorjahrOgrundg, gbc);
        
        JLabel diffVorjahrOgrundgEin = new JLabel(euroEin + "");
        gbl(2, 0, 1, 1);
        add(diffVorjahrOgrundgEin, gbc);
        
        //Betrag ohne Grundgebühr
        JLabel betragOGrundgebuehr = new JLabel("Betrag ohne Grundgebühr:");
        gbl(0, 1, 1, 1);
        add(betragOGrundgebuehr, gbc);
        
        betragOgrundG = new JTextField();
        betragOgrundG.setPreferredSize(new Dimension(100, 20));
        betragOgrundG.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 1, 1, 1);
        add(betragOgrundG, gbc);
        
        JLabel betragOgrundgein = new JLabel(euroEin + "");
        gbl(2, 1, 1, 1);
        add(betragOgrundgein, gbc);
                        
        //Differenz Vorjahr
        JLabel lblBdiffVj = new JLabel("Differenz Vj:");
        gbl(0, 2, 1, 1);
        add(lblBdiffVj, gbc);
        
        diffVJ = new JTextField();
        diffVJ.setPreferredSize(new Dimension(100, 20));
        diffVJ.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 2, 1, 1);
        add(diffVJ, gbc);
        
        JLabel differenzVJein = new JLabel(euroEin + "");
        gbl(2, 2, 1, 1);
        add(differenzVJein, gbc);
        
        //Aktueller Rechnungsbetrag
        JLabel aktuellerRechBetrag = new JLabel("Aktueller Rechnungsbetrag:");
        gbl(0, 3, 1, 1);       
        add(aktuellerRechBetrag, gbc);
        
        aktRechnungsbetrag = new JTextField();
        aktRechnungsbetrag.setPreferredSize(new Dimension(100, 20));
        aktRechnungsbetrag.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 3, 1, 1);
        add(aktRechnungsbetrag, gbc);
        
        JLabel aktuellerRechEin = new JLabel(euroEin + "");
        gbl(2, 3, 1, 1);
        add(aktuellerRechEin, gbc);
                        
        //Stand in kWh
        JLabel lblBstndKwh = new JLabel("Stand in kWh:");
        gbl(0, 4, 1, 1);
        add(lblBstndKwh, gbc);
        
        anzKwh = new JTextField();
        anzKwh.setPreferredSize(new Dimension(100, 20));
        anzKwh.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 4, 1, 1);
        add(anzKwh, gbc);
        
        JLabel lblBeinKwh = new JLabel(kwhEin);
        gbl(2, 4, 1, 1);
        add(lblBeinKwh, gbc);
        
        //Rechnungszeitraum
        JLabel lblBrchztr = new JLabel("Rechnungszeitraum:");
        gbl(0, 5, 1, 1);
        add(lblBrchztr, gbc);
        
        anzRechnungszeitraum = new JTextField();
        anzRechnungszeitraum.setPreferredSize(new Dimension(100, 20));
        anzRechnungszeitraum.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 5, 1, 1);
        add(anzRechnungszeitraum, gbc);
        
        JLabel lblKubRchztr = new JLabel("m" + kubikEin);
        gbl(2, 5, 1, 1);
        add(lblKubRchztr, gbc);       
        
        //Aktueller Stand und Eingabe       
        JLabel lblBakt = new JLabel("Aktueller Stand:");
        gbl(0, 6, 1, 1);
        add(lblBakt, gbc);
        
        eingabeKubik = new JTextField();
        eingabeKubik.setPreferredSize(new Dimension(100, 20));
        eingabeKubik.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 6, 1, 1);
        add(eingabeKubik, gbc);
        
        JLabel lblBkubik = new JLabel("m" + kubikEin);
        gbl(2, 6, 1, 1);
        add(lblBkubik, gbc);
        
        
//Button Aufruf verrechnen()               
        JButton btnOk = new JButton("OK");
        gbc.anchor = GridBagConstraints.CENTER;
        gbl(0, 7, 3, 1);
        gbc.ipadx = 30;
        gbc.ipady = 3;
        btnOk.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                doubEingabe = Double.parseDouble(eingabeKubik.getText());
                verrechnen();
                betragOgrundG.setText(kostenOGrundg + "");
                diffVorjahrOgrundg.setText(diffVJoGrundg + "");
                anzKwh.setText(kwh + "");
                anzRechnungszeitraum.setText(rechnungszeitraum + "");
                aktRechnungsbetrag.setText(aktKosten + "");
                diffVJ.setText(diffVJaus + "");
            }
        });
                add(btnOk, gbc);
    }
}

MFG

MasterShredder
 
Um Eingaben zu verhindern, kann man z. B. einen DocumentFilter verwenden:

Java:
import javax.swing.*;
import javax.swing.text.*;

public class Test {
    class IntegerFilter extends DocumentFilter {
        @Override
        public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
            if (isNumeric(text)) {
               super.insertString(fb, offset, text, attr);
            }
        }

        @Override
        public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException {
            if (isNumeric(text)) {
               super.replace(fb, offset, length, text, attr);
            }
        }

        private boolean isNumeric(String text) {
            return text != null && text.matches("\\d*");
        }
    }

    public void run() {
        JTextField tf = new JTextField(50);
        AbstractDocument doc = (AbstractDocument) tf.getDocument();
        doc.setDocumentFilter(new IntegerFilter());

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(tf);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Hallo,

nun der eigentliche Effekt ist da 🙂, Also könnte jetzt in mein EingabeTextField nur Zahlen eingeben, super tolle Sache.
Jetzt ist meine Frage ob ich es so richtig umgesetzt habe.
Beschreibe mal kurz mein Programm:

Also es besteht aus

Paket: Hauptprogramm

Klassen: Verbrauchsrechner(Mainklasse)
GasPanel​
StromPanel​

Paket: Subclasses

Klassen: IntegerFilter

Also es funktioniert es stellt sich mir jetzt die Frage, ob mein Aufruf von IntegerFilter über meine Klasse IntegerFilter mit meinen Überschriebenen Methoden geht, oder durch den default Weg.

Java:
package Hauptprogramm;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.text.AbstractDocument;

import Subclasses.IntegerFilter;

public class GasPanel extends JPanel{
        
//Attribute
    private double zustandszahl = 0.94876, brennwert = 11.296, abzuege = 2236;
    private double doubEingabe, rechnungszeitraum, kwh, aktKosten, kostenOGrundg, diffVJoGrundg, diffVJaus;
    private JTextField anzRechnungszeitraum, anzKwh, diffVJ, eingabeKubik, aktRechnungsbetrag, diffVorjahrOgrundg, betragOgrundG;
    //Einheiten
    private String kwhEin = "kWh";
    private char kubikEin = '\u00B3', euroEin = '\u20AC';
    
    //GridBagContrains Objekt
    GridBagConstraints gbc = new GridBagConstraints();
    
    
//Konstruktor
    public GasPanel() {           
    setLayout(new GridBagLayout());               
    setPreferredSize(new Dimension(500, 300));
    gbc.insets = new Insets(2, 2, 2, 2);
    fenster();
    }
        
//Zuweisung GridBagLayout
    private void gbl(int gx, int gy, int gw, int gh) {
        gbc.gridx = gx;
        gbc.gridy = gy;
        gbc.gridwidth = gw;
        gbc.gridheight = gh;
        }
        
//Verrechnung       
    private void verrechnen() {
        //Umwandlung in kWh
        rechnungszeitraum = doubEingabe - abzuege;
        kwh = Math.round(rechnungszeitraum * zustandszahl * brennwert);
    //kWh * Preis/kWh auf Euro + Grundgebuehr - Vorjahresrechnung
        
        //Preis ohne Grundgebühr
        kostenOGrundg = Math.round(kwh * 6.39 / 100);
        diffVJoGrundg = Math.round(kostenOGrundg - 385.83);
        
        //Aktuelle Gesamtkosten
        aktKosten = Math.round(kwh * 6.39 / 100 + 123.76);
        double diffVJ = aktKosten;
        diffVJaus = Math.round(diffVJ - 385.83);
        }
        
//Fensteraufbau   
    public void    fenster() {
        
        //Differenz Vorjahr ohne Grundgebühr
        JLabel diffVJohneGrundgebuehr = new JLabel("Differenz Vorjahr ohne Grundgebühr:");
        gbc.anchor = GridBagConstraints.LINE_START;
        gbl(0, 0, 1, 1);
        add(diffVJohneGrundgebuehr, gbc);
        
        diffVorjahrOgrundg = new JTextField();
        diffVorjahrOgrundg.setPreferredSize(new Dimension(100, 20));
        diffVorjahrOgrundg.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 0, 1, 1);
        add(diffVorjahrOgrundg, gbc);
        
        JLabel diffVorjahrOgrundgEin = new JLabel(euroEin + "");
        gbl(2, 0, 1, 1);
        add(diffVorjahrOgrundgEin, gbc);
        
        //Betrag ohne Grundgebühr
        JLabel betragOGrundgebuehr = new JLabel("Betrag ohne Grundgebühr:");
        gbl(0, 1, 1, 1);
        add(betragOGrundgebuehr, gbc);
        
        betragOgrundG = new JTextField();
        betragOgrundG.setPreferredSize(new Dimension(100, 20));
        betragOgrundG.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 1, 1, 1);
        add(betragOgrundG, gbc);
        
        JLabel betragOgrundgein = new JLabel(euroEin + "");
        gbl(2, 1, 1, 1);
        add(betragOgrundgein, gbc);
                        
        //Differenz Vorjahr
        JLabel lblBdiffVj = new JLabel("Differenz Vj:");
        gbl(0, 2, 1, 1);
        add(lblBdiffVj, gbc);
        
        diffVJ = new JTextField();
        diffVJ.setPreferredSize(new Dimension(100, 20));
        diffVJ.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 2, 1, 1);
        add(diffVJ, gbc);
        
        JLabel differenzVJein = new JLabel(euroEin + "");
        gbl(2, 2, 1, 1);
        add(differenzVJein, gbc);
        
        //Aktueller Rechnungsbetrag
        JLabel aktuellerRechBetrag = new JLabel("Aktueller Rechnungsbetrag:");
        gbl(0, 3, 1, 1);       
        add(aktuellerRechBetrag, gbc);
        
        aktRechnungsbetrag = new JTextField();
        aktRechnungsbetrag.setPreferredSize(new Dimension(100, 20));
        aktRechnungsbetrag.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 3, 1, 1);
        add(aktRechnungsbetrag, gbc);
        
        JLabel aktuellerRechEin = new JLabel(euroEin + "");
        gbl(2, 3, 1, 1);
        add(aktuellerRechEin, gbc);
                        
        //Stand in kWh
        JLabel lblBstndKwh = new JLabel("Stand in kWh:");
        gbl(0, 4, 1, 1);
        add(lblBstndKwh, gbc);
        
        anzKwh = new JTextField();
        anzKwh.setPreferredSize(new Dimension(100, 20));
        anzKwh.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 4, 1, 1);
        add(anzKwh, gbc);
        
        JLabel lblBeinKwh = new JLabel(kwhEin);
        gbl(2, 4, 1, 1);
        add(lblBeinKwh, gbc);
        
        //Rechnungszeitraum
        JLabel lblBrchztr = new JLabel("Rechnungszeitraum:");
        gbl(0, 5, 1, 1);
        add(lblBrchztr, gbc);
        
        anzRechnungszeitraum = new JTextField();
        anzRechnungszeitraum.setPreferredSize(new Dimension(100, 20));
        anzRechnungszeitraum.setBackground(UIManager.getColor("Button.background"));
        gbl(1, 5, 1, 1);
        add(anzRechnungszeitraum, gbc);
        
        JLabel lblKubRchztr = new JLabel("m" + kubikEin);
        gbl(2, 5, 1, 1);
        add(lblKubRchztr, gbc);       
        
        //Aktueller Stand und Eingabe       
        JLabel lblBakt = new JLabel("Aktueller Stand:");
        gbl(0, 6, 1, 1);
        add(lblBakt, gbc);
        
        eingabeKubik = new JTextField();
        eingabeKubik.setPreferredSize(new Dimension(100, 20));
        eingabeKubik.setBackground(UIManager.getColor("Button.background"));
        AbstractDocument doc = (AbstractDocument) eingabeKubik.getDocument();
        doc.setDocumentFilter(new IntegerFilter());
        gbl(1, 6, 1, 1);
        add(eingabeKubik, gbc);
        
        JLabel lblBkubik = new JLabel("m" + kubikEin);
        gbl(2, 6, 1, 1);
        add(lblBkubik, gbc);
        
        
//Button Aufruf verrechnen()               
        JButton btnOk = new JButton("OK");
        gbc.anchor = GridBagConstraints.CENTER;
        gbl(0, 7, 3, 1);
        gbc.ipadx = 30;
        gbc.ipady = 3;
        btnOk.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                doubEingabe = Double.parseDouble(eingabeKubik.getText());
                verrechnen();
                betragOgrundG.setText(kostenOGrundg + "");
                diffVorjahrOgrundg.setText(diffVJoGrundg + "");
                anzKwh.setText(kwh + "");
                anzRechnungszeitraum.setText(rechnungszeitraum + "");
                aktRechnungsbetrag.setText(aktKosten + "");
                diffVJ.setText(diffVJaus + "");
            }
        });
                add(btnOk, gbc);
    }
}

Java:
package Subclasses;

import javax.swing.text.*;

public class IntegerFilter extends DocumentFilter{
    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr)
                            throws BadLocationException {
        if (isNumeric(text)) {
           super.insertString(fb, offset, text, attr);
        }
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr)
                        throws BadLocationException {
        if (isNumeric(text)) {
           super.replace(fb, offset, length, text, attr);
        }
    }

    private boolean isNumeric(String text) {
        return text != null && text.matches("\\d*");
    }
}

Und dann wollte ich in den übrigen TextFeldern, die Eingabe GANZ verbieten auch so dass der cursor nicht mehr blinkt.
Die sind eigentlich nur als grafische Komponente dar, und sollen nur meine Ergebnisse anzeigen.
 
ob mein Aufruf von IntegerFilter über meine Klasse IntegerFilter mit meinen Überschriebenen Methoden geht, oder durch den default Weg.
Welche überschriebenen Methoden?!?

Und dann wollte ich in den übrigen TextFeldern, die Eingabe GANZ verbieten auch so dass der cursor nicht mehr blinkt.
Die sind eigentlich nur als grafische Komponente dar, und sollen nur meine Ergebnisse anzeigen.
setEditable(false); oder ein JLabel verwenden.
 
Wenn es nur darum geht, Punkte zuzulassen, wäre es einfach: pass die Methode isNumeric und den Namen der Klasse an.

Allerdings wird es Dir darum gehen, nur gültige Zahlen eingeben zu lassen und das wird dann ein klein wenig schwieriger. Du musst im Prinzip vorab die Operation für den bereits vorhandenen Text durchführen und anschließend testen, ob es sich um eine Zahl handelt.

Beim Einfügen ist das relativ simpel, da es keine Rolle spielt, wo Du den neuen Text einfügst (es spielt keine Rolle, wo in der Zahl der Punkt auftaucht; wenn es am Ende mehr als einen Punkt gibt, ist die Eingabe ungültig). Eine Ersetzung musst Du dagegen wirklich durchführen, da ein bereits vorhandener Punkt ersetzt werden könnte.

Das Prüfen, ob die Zahl gültig ist, kannst Du entweder nach wie vor mit einem Regex erledigen oder aber Du lässt die Zahl parsen und fängst die ggf. auftretende Exception ab.
 
Ah double😅,

Gegenfrage: soll 11.11.11......1111 eine gültige Eingabe sein?

Nun da kommen wir, glaube ich, zu einem anderen Thema, dass ich als nächstes angehen wollte.

Ich nenne es mal runtlaufen😏.

Ich will das wenn keine Eingabe im TF ist und ich den Button betätigte, kein Fehler auftritt. Ich denke mal das könnte man dann so lösen, dass eine eingabe mit nichts(keine Eingabe) verweigert wird.

Dann könnte man die Eingabe schon, nur in einem bestimmten Format zulassen max ein Punkt und so weiter.
 
Mhh,
gibt es darüber vielleicht was zu lesen?
Auch über dazugehörige Bereiche?
Bin ehrlich gesagt momentan nicht in der Nähe meines Rechners, erst am Wochenende wieder.

Würde in der Zeit, mich gerne über das Thema informieren.
 
Worüber/über welches Thema willst Du was lesen?

Wie man ein Double parsen kann?
Java:
try {
    double value = Double.parseDouble(text);
} catch (NumberFormatException | NullPointerException ex) {
    // kein double -> passend reagieren
}
 
Ich denke mal du suchst das hier:
Java:
import java.awt.GridLayout;
import java.text.NumberFormat;
import java.util.Locale;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.NumberFormatter;

public class NF {
	public static void main(String[] args) {
		JLabel l = new JLabel();

		NumberFormatter nf = new NumberFormatter(NumberFormat.getInstance(Locale.GERMANY));
		nf.setValueClass(Double.class);
		nf.setAllowsInvalid(false);
		nf.setCommitsOnValidEdit(true);

		JFormattedTextField tf = new JFormattedTextField(nf);
		tf.getDocument().addDocumentListener(new DocumentListener() {
			@Override
			public void removeUpdate(DocumentEvent e) {
				upd();
			}

			@Override
			public void insertUpdate(DocumentEvent e) {
				upd();
			}

			@Override
			public void changedUpdate(DocumentEvent e) {
				upd();
			}

			public void upd() {
				l.setText(tf.getText());
				l.repaint();
			}
		});

		JFrame f = new JFrame();
		f.setLayout(new GridLayout(2, 1));
		f.add(tf);
		f.add(l);
		f.pack();
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
}

Aber sei gewarnt, die Eingabe von double Werten wird dadurch etwas ungewohnt... (man kann nicht einfach ein Komma hinzufügen, weil die Eingabe dann ungültig werden würde...)
 
So melde mich zurück,

ja das kommt mir wie ein sehr komplexes Thema vor 😄.

Bin hier am lesen:
http://openbook.rheinwerk-verlag.de/java8/02_002.html#i02_09
http://openbook.rheinwerk-verlag.de/javainsel/20_005.html#u20.5.3

Von der Document Klasse, XML, DOM.... Ach ja, ich glaube das hat nie ein Ende😁😂.

Ich dachte als erstes ich müsste einfach der Klasse und der Methode den Namen "DoubleFilter und isDouble" geben da habe ich mich scheinbar getäuscht.

Du meintest Name der Klasse da sich was ändert, und die Methode anpassen.

Hier ist mein Versuch(der nicht funktioniert):
Java:
package Subclasses;

import javax.swing.text.*;

public class DoubleFilter extends DocumentFilter{
    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr)
                            throws BadLocationException {
        if (isNumeric(text)) {
           super.insertString(fb, offset, text, attr);
        }
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr)
                        throws BadLocationException {
        if (isNumeric(text)) {
           super.replace(fb, offset, length, text, attr);
        }
    }

    private boolean isNumeric(String text) {
        return text != null && text.matches("\\d* \\p{Punct}?");
    }
}

So wie ich das jetzt verstanden habe, nehmen wir den String entgegen und testen mit .matches ob sich \d die Ziffern [0-9] dort befinden und * ob sie keinmal oder beliebig oft drin vorkommt. Mein Versuch jetzt noch ein Punktzeichen hinzu zufügen ist gescheitert. Geschweige den nur den Punkt.
 
Mein Versuch jetzt noch ein Punktzeichen hinzu zufügen ist gescheitert. Geschweige den nur den Punkt.
Ein Punkt geht mit \\..

Kommazahlen sind als Regex etwas komplizierter als nur Integer. Du brauchst mindestens eine Ziffer, dann optional ein Punkt und mindestens eine weitere Ziffer, und das als ganzes Optional, wenn leere Eingaben gültig sein sollen.
Das ganze ergibt dann etwa sowas: ^(\\d+(\\.\\d+)?)$
 

Zurück
Oben