# Die Eingabe in einem JTextField beschränken



## Alex_winf01 (29. Jun 2009)

Hallo liebe Forengemeinde,

wie kann ich die Eingabe in einem JTextField beschränken? Ich habe ein Textfeld, da sollen nur Eingaben wie z. B. 1.0 oder 10.1 oder 100.1 erlaubt sein. Wie kann ich das realisieren? Es soll immer nur eine Stelle nach dem Punkt eingegeben werden können.


----------



## musiKk (29. Jun 2009)

Vermutlich geht das mit einem Listener, der das bei der Eingabe ständig prüft. Bei einem JTextField ist das wohl ein DocumentListener auf dem Document des Textfeldes. In den Java Tutorials von Sun gibts auch Informationen.


----------



## Gast2 (29. Jun 2009)

oder damit
How to Use Formatted Text Fields (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)

Einfach ein DecimalFormat als Formatter setzen und die Nachkomma stelle auf maximal 1 setzen...


----------



## Alex_winf01 (30. Jun 2009)

@ musiKk

Mit dem Listener hab ich verstanden. Aber wie höhre ich einfach nach dem 1. Wert nach dem Punkt auf? z. B. 1.1 ist zulässig, 1.12 nicht mehr?


----------



## Gast2 (30. Jun 2009)

Und warum nicht Variante 2 ohne Listener?


```
public class Test extends JFrame {

    public Test() {

        DecimalFormat format = (DecimalFormat) NumberFormat.getNumberInstance(Locale.US);
        
        format.setMaximumIntegerDigits(100);
        format.setMaximumFractionDigits(1);
        format.setGroupingUsed(false);
       
        CNumberFormatter formatter = new CNumberFormatter(format);
        JFormattedTextField formattedTextField = new JFormattedTextField();
        formattedTextField.setFormatterFactory(new DefaultFormatterFactory(formatter));
        formatter.setAllowsInvalid(false);
formatter.setValueClass(Double.class);
       
        
        add(formattedTextField);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public class CNumberFormatter extends NumberFormatter {

        private DecimalFormat format;
        private int oldFracMin;
        private int textLength;

        public CNumberFormatter(DecimalFormat format) {
            super(format);
            this.format = format;
            oldFracMin = format.getMinimumFractionDigits();
        }

        @Override
        public Object stringToValue(String text) throws ParseException {

            if (text.trim().length() > 0 && !text.equals(format.getNegativePrefix()) && !format.isParseIntegerOnly()) {
                int index = text.indexOf(format.getDecimalFormatSymbols().getDecimalSeparator());
                if (index == text.length() - 1 && textLength <= text.length()) {

                    format.setMinimumFractionDigits(format.getMaximumFractionDigits());
                } else {
                    format.setMinimumFractionDigits(oldFracMin);
                }
            }
            textLength = text.length();
            return text.trim().length() == 0 || text.equals(format.getNegativePrefix()) ? null : super.stringToValue(text);
        }

        @Override
        public String valueToString(Object value) throws ParseException {

            String text = value == null ? "" : super.valueToString(value);
            return text;
        }
    }


    public static void main(String[] args) throws IOException {
        new Test();
    }

}
```

Falls irgendwas nicht passt oder sich falsch verhält musst die stringToValue methode abändern les dir einfach mal den link druch eventuell gehts noch einfacher...
aber solang das   formatter.setAllowsInvalid(false); gesetzt ist kannst du keine falschen eingaben machen eigentlich auch kein punkt darum hab ich die mthode überschrieben...
wenn   du formatter.setAllowsInvalid(true); kannst du falsche eingaben machen, ABER wenn du enter oder den fokus verlierst validiert das Textfeld und macht das richtige ergebnis dann brauchst du den formatter überhaupt nicht...
Je nachdem was du brauchst und wie es dir besser gefällt.


----------



## musiKk (30. Jun 2009)

Mit setText() die ungültige Eingabe immer wieder überschreiben oder so, aber schau Dir mal den Link von SirWayne an, das sieht geeigneter aus.


----------

