JTextField nur Zahleneingaben zulassen, eingabe sperren

M

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
 
mihe7

mihe7

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

MasterShredder

Aktives Mitglied
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.
 
mihe7

mihe7

Top Contributor
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.
 
M

MasterShredder

Aktives Mitglied
Danke,
setEditable hat funktioniert.

Ja ich überschreibe (@Override) ja doch jetzt die Methoden von DocumentFilter, und denke mal, passe sie etwas an.
 
M

MasterShredder

Aktives Mitglied
Oh,
mir ist gerade aufgefallen das der Punkt . in der Funktion des Kommas nicht geht.
Gut den bräuchte ich auch noch. Optimalerweise auch nur den.
 
mihe7

mihe7

Top Contributor
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.
 
M

MasterShredder

Aktives Mitglied
Was heisst gültige Zahlen?
Also eigentlich geht es mir nur darum, dass ich Zahlen und einen Punkt eingeben kann.

Wie muss ich die Namen anpassen?
 
M

MasterShredder

Aktives Mitglied
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.
 
M

MasterShredder

Aktives Mitglied
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.
 
mihe7

mihe7

Top Contributor
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
}
 
M

MasterShredder

Aktives Mitglied
Über die DocumentFilter Klasse, Regex, halt über das zulassen von Eingaben (filtern)
 
B

BestGoalkeeper

Bekanntes Mitglied
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...)
 
M

MasterShredder

Aktives Mitglied
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.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
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+)?)$
 
M

MasterShredder

Aktives Mitglied
Das ganze ergibt dann etwa sowas: ^(\\d+(\\.\\d+)?)$
Habe es probiert, funktioniert nicht.

Java:
    private boolean isNumPoint(String text) {
        return text != null && text.matches("^(\\d+(\\.\\d+)?)$");
    }
}

und das als ganzes Optional, wenn leere Eingaben gültig sein sollen.

Nein, also eine leere Eingabe soll nicht "gültig" sein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JButton und JTextField Java Basics - Anfänger-Themen 1
J JTextField Bezeichnung als Variable Java Basics - Anfänger-Themen 3
M Von einem JTextField Doublewerte entgegennehmen Java Basics - Anfänger-Themen 2
M JTextField in ArrayList speichern Java Basics - Anfänger-Themen 4
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
G JTextField per Button speichern und an andere Klasse übergeben Java Basics - Anfänger-Themen 2
D Klassen JTextField wird nur zu 50% angezeigt. Java Basics - Anfänger-Themen 15
F JTextField Kursiv und Fett machen Java Basics - Anfänger-Themen 4
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
M JTextField blitzt immer wieder nur auf Java Basics - Anfänger-Themen 12
UnknownInnocent Interface JTextField: Action mit Enter ausführen Java Basics - Anfänger-Themen 16
K Methoden JTExtField mit Array erzeugen Java Basics - Anfänger-Themen 13
N Abfragen eines Textes aus einem JTextField in Java, Funktion, CardLayout, Java Basics - Anfänger-Themen 2
J Erste Schritte Wert aus JTextField zurückgeben Java Basics - Anfänger-Themen 6
F Aus einer anderen Klasse auf ein JTextField zugreifen Java Basics - Anfänger-Themen 6
P Cursor in JTextField setzen Java Basics - Anfänger-Themen 11
F Variablen JTextField-Inhalt kann nicht mit String abgeglichen werden Java Basics - Anfänger-Themen 2
F Interface JTextField am Anfang unsichtbar o_o Java Basics - Anfänger-Themen 3
D Klassen Wert aus JTextfield in JLabel (andere Klasse) darstellen. Java Basics - Anfänger-Themen 60
D JButton soll Farbe von JTextfield ändern Java Basics - Anfänger-Themen 5
S Variable in JTextField soll immer um 5 zunehmen Java Basics - Anfänger-Themen 8
B Interface JTextField Eingabe als String verwenden Java Basics - Anfänger-Themen 3
K OOP Mit anderer Klasse auf JTextField zugreifen Java Basics - Anfänger-Themen 5
Liondary JTextfield Java Basics - Anfänger-Themen 8
W JTextField-Objekt liest Umlaute mit falschen Zeichen ein Java Basics - Anfänger-Themen 5
Z Fürge nur ein JTextField ein und danach wird nichts mehr angezeigt Java Basics - Anfänger-Themen 3
S JTextField zu ArrayList hinzufügen Java Basics - Anfänger-Themen 3
Z Vector in jTextField/jLabel darstellen Java Basics - Anfänger-Themen 4
Z JTextField - getText() Methode abbrechen? Java Basics - Anfänger-Themen 8
P jTextField - Auslesen, in Variablen speichern, eingeben... Java Basics - Anfänger-Themen 7
J Methoden JTextArea auslesen und in JTextfield ausgeben Java Basics - Anfänger-Themen 13
M Double-Ausgabe in JTextField fehlerhaft Java Basics - Anfänger-Themen 2
U Inhalt von JTextfield an andere Klasse weitergeben Java Basics - Anfänger-Themen 13
I JTextfield[] innerhalb eines Itemlistener aufrufen Java Basics - Anfänger-Themen 2
S Einzelne Buchstaben aus Jtextfield in array Java Basics - Anfänger-Themen 2
S Verhalten von JTextField in einem JTabbedPane (Register) Java Basics - Anfänger-Themen 6
L JTextField/Listener Input Problem Java Basics - Anfänger-Themen 2
G JTextField, DocumentListener, Fehler bei setText() Java Basics - Anfänger-Themen 3
S Input/Output GUI Eingabe in JTextfield in Variable speichern Java Basics - Anfänger-Themen 7
C JTextField füllen Java Basics - Anfänger-Themen 5
C jtextfield und jtable Java Basics - Anfänger-Themen 34
K JTextField in ein Spiel einfügen Java Basics - Anfänger-Themen 2
K Encoding von JTextfield Java Basics - Anfänger-Themen 2
X JTable mit Inhalten aus JTextField o.ä. füllen Java Basics - Anfänger-Themen 4
P Klassen JTextfield aus anderer Klasse herausfüllen Java Basics - Anfänger-Themen 12
K JTextField auslesen, in int umwandeln und in einer anderen Klasse als Zähler verwenden Java Basics - Anfänger-Themen 3
M Datumsformat in JTextfield Java Basics - Anfänger-Themen 10
S JTextField nervt rum... Java Basics - Anfänger-Themen 4
B JTextField Java Basics - Anfänger-Themen 5
D Durch Button klick wert in JTextField einfügen Java Basics - Anfänger-Themen 5
J Verknüpfung von JButton to JTextField Java Basics - Anfänger-Themen 4
B JTextField Java Basics - Anfänger-Themen 5
C Problem mit JTextField Java Basics - Anfänger-Themen 8
A Klassen JTextField eigtl leer aber es werden Methoden ect. angezeigt Java Basics - Anfänger-Themen 9
P Datentypen String auf JTextField wird zu Char-Array und anschließend zu int Java Basics - Anfänger-Themen 12
L JTextField auslesen mit getText() wie abspeichern? Java Basics - Anfänger-Themen 2
D jtextField Ausgabe double Java Basics - Anfänger-Themen 4
D JTextField verwenden ohne Eingabe einer Variable Java Basics - Anfänger-Themen 4
J GUI - JTextField Anordnung Java Basics - Anfänger-Themen 2
S nur Buchstaben in JTextField Java Basics - Anfänger-Themen 3
S JTextfield Auswertung mit FocusListener Java Basics - Anfänger-Themen 7
M Hilfe JTextfield Ergebnis Java Basics - Anfänger-Themen 2
B GUI- JTextField - Übung Java Basics - Anfänger-Themen 5
M OOP Wie greife ich auf JTextField zu? Java Basics - Anfänger-Themen 2
P Eingabe aus JTextField/Area an eine andere Klasse übergeben. Java Basics - Anfänger-Themen 2
M Input/Output JFrame mit JButton und JTextfield Java Basics - Anfänger-Themen 114
F GUI JTextField aktualisieren Java Basics - Anfänger-Themen 3
B jTextField bei Enter eingabe absenden? Java Basics - Anfänger-Themen 2
S JTextField leeren ohne setText("")? Java Basics - Anfänger-Themen 3
A fire button on JTextField Enter Java Basics - Anfänger-Themen 2
G JTextField() Anzeige - if-Anweisungen Java Basics - Anfänger-Themen 2
R Erste Schritte codecopieren von Editor nach Eclipse / JTextField Java Basics - Anfänger-Themen 4
L Zeichen in jTextField markieren Java Basics - Anfänger-Themen 2
M Text auf JTextField auslesen per Button Java Basics - Anfänger-Themen 4
L JTextField getText() gibt immer null zurück Java Basics - Anfänger-Themen 10
L Null Pointer Exception bei Focus Event bei einem JTextField Java Basics - Anfänger-Themen 2
C Ausgewähltes Element einer JCombobox in JTextField Java Basics - Anfänger-Themen 3
H Prüfen welches JTextfield ausgewählt/selektiert ist? Java Basics - Anfänger-Themen 7
B Input/Output jTextField - KeyEvent - Zeichen soll nicht erscheinen Java Basics - Anfänger-Themen 6
D JPasswordField - JTextField Java Basics - Anfänger-Themen 5
J JTextfield mit Enter leeren Java Basics - Anfänger-Themen 3
H JtextField auslesen und in JLable einfuegen Java Basics - Anfänger-Themen 7
D JTextField anstatt Jbuttons Java Basics - Anfänger-Themen 9
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
S mit eigener Klasse JTextField ändern Java Basics - Anfänger-Themen 3
M JTextField durch Button auslösen Java Basics - Anfänger-Themen 9
J JLabel mit Hilfe von JTextfield benennen Java Basics - Anfänger-Themen 7
J Keylistener aber wie jTextField auswahl? Java Basics - Anfänger-Themen 3
M JTextField Java Basics - Anfänger-Themen 7
O JTextField Schriftgröße ändern Java Basics - Anfänger-Themen 1
J Nur ein Komma in JTextField zulassen... Java Basics - Anfänger-Themen 9
C Problem mit JPopupMenu, JTextField und Keylistener Java Basics - Anfänger-Themen 2
S JTextField an SQL mit -> Kommazahlen Java Basics - Anfänger-Themen 4
K JTextField auslesen, wenn Enter gedrückt.. Java Basics - Anfänger-Themen 13
T JTextField max. 8 Zeichen, nur Buchstaben Java Basics - Anfänger-Themen 8
D Datumkontrolle in einem jTextField Java Basics - Anfänger-Themen 4
N JTextfield Java Basics - Anfänger-Themen 5
T OOP JTextField konfigurieren Java Basics - Anfänger-Themen 9
R Eingabe in JTextField speichern Java Basics - Anfänger-Themen 30
F Position JTextField Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Anzeige

Neue Themen


Oben