Akzeptiere nur zahlen und einen Punkt in Java TextField
Ich habe ein textField, wo ich akzeptiere nur zahlen von der Tastatur, aber nun muss ich es ändern, da es eine "Preis-textField" und ich würde auch akzeptieren müssen ein Punkt "." für jede Art von Preisen.
Wie kann ich dies ändern, um zu bekommen, was ich brauche?
ptoMinimoField = new JTextField();
ptoMinimoField.setBounds(348, 177, 167, 20);
contentPanel.add(ptoMinimoField);
ptoMinimoField.setColumns(10);
ptoMinimoField.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char caracter = e.getKeyChar();
if (((caracter < '0') || (caracter > '9'))
&& (caracter != '\b')) {
e.consume();
}
}
});
- b) nicht keyListeners, Sie sind waaayyy zu low-level b) nicht Verwandte: nicht jede manuelle Dimensionierung/Anordnung der Komponenten - das ist die exklusive Aufgabe eines geeigneten LayoutManager
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorgeschlagen von Oracle ,Verwenden Sie Formatierte Textfelder
JTextField txField = new DoubleJTextField();
Erstellen Sie eine Datei DoubleJTextField.java und glücklich sein
Ich benutze nur eine
try
-catch
block:Integer.parseInt
wirft einenNumberFormatException
wenn die Eingabe 1,2 oder ähnlichVerwenden Sie nicht immer einen KeyListener für diese. Dein code oben hat zwei gravierende Fehler, bedingt durch die Verwendung von einem KeyListener. Erstens wird es verpassen, jeder text wird eingefügt. Immer, wenn ich ein Feld Filter, die aus nicht-Ziffern, die ich immer versuchen, fügen Sie etwas text, nur so zum Spaß. Neun mal von zehn, der text wird akzeptiert, weil Sie verwendet einen key-listener.
Sekunde, die Sie nicht herausfiltern Modifikatoren. Wenn der Benutzer versucht, Ihre Arbeit zu speichern durch die Eingabe von Ctrl-s, während Sie in diesem Feld, Ihre key-listener verbraucht der Veranstaltung. Und wenn Ihre Anwendung ordnet, sagen wir, ein control-5 oder alt + 5 shortcut auf einige Maßnahmen, diese KeyListener hinzufügen eine 5 auf dem Feld, wenn Sie geben es, obwohl der Benutzer gar nicht versucht, zu geben ein Zeichen. Sie doch herausfinden, dass Sie benötigt, um übergeben Sie die "backspace" - Taste, aber das ist nicht alles, was Sie brauchen, um passieren. Ihre Pfeil-Tasten funktionieren nicht. Weder wird Ihr Funktionstasten. Sie beheben können all diese Probleme, aber es beginnt zu viel Arbeit.
Gibt es eine Dritte Nachteil, aber es zeigt nur, wenn Sie passen Sie Ihre Anwendung zu einem fremden alphabet, besonders eine, die mehrere Tastenanschläge zu generieren, die ein einzelnes Zeichen, wie die chinesische. Diese Alphabete machen KeyListeners nutzlos.
Das Problem ist dieses. Sie müssen filter-Zeichen, aber KeyListeners nicht über die Zeichen, Sie sind über die Tastenanschläge, die sind nicht das gleiche: Nicht alle Tastenanschläge erzeugen Zeichen, und nicht alle Zeichen werden erzeugt, indem Tastatureingaben. Sie brauchen einen Ansatz, der sich mit Zeichen, nachdem Sie erzeugt wurden, und nach geändert Tastatureingaben haben bereits herausgefiltert wurden.
Der einfachste Ansatz ist die Verwendung eines JFormattedTextField, aber ich habe noch nie mochte diesen Ansatz, da es ja nicht formatieren, oder während der Eingabe gefiltert. So anstelle, werde ich einen DocumentFilter. DocumentFilters nicht betreiben auf Tastatureingaben, operieren Sie auf die text-strings, wie Sie eingefügt, um Ihre JTextField-Datenmodell. Also alle control-Tasten, Pfeil-und Funktionstasten und so erreichen nicht einmal den DocumentFilter. Alle eingefügten text geht durch den DocumentFilter, zu. Und Sprachen, dass Sie drei Tastenanschläge zu generieren, die ein einzelnes Zeichen, das DocumentFilter nicht aufgerufen wird, bis das Zeichen generiert wird. Hier ist, wie es aussieht:
Den DigitFilter-Klasse sieht wie folgt aus:
Könnten Sie schreiben, diese als innere Klasse, aber ich eine separate Klasse, so können Sie überschreiben Sie die accept () - Methode zu verwenden Kriterien, die Sie wollen. Sie können auch feststellen, dass ich nicht testen kann für zahlen, die durch das schreiben dieses:
Statt, so mache ich das:
Dies ist schneller, sauberer, und arbeitet mit ausländischen Nummerierung Systeme. Ich weiß auch nicht brauchen, Ihre Prüfung für das backspace-Zeichen, '\b'. Ich vermute, dass Ihre ersten KeyListener war das herausfiltern der "backspace" - Taste, das war der erste Hinweis darauf, dass es der falsche Ansatz.
Und auf einem nicht verwandten note, nicht zu schwer-code Ihrer Komponente Positionen. Weitere Informationen zur Verwendung des LayoutManagers. Sie sind einfach zu bedienen, und Sie werden Ihren code viel einfacher zu pflegen.
Haben Sie sich ein JFormattedTextField? Es scheint, als würde es das macht, was Sie wollen.
Geben Sie die doppelte Anzahl der
JTextField
in javaDiese bit-code;
entscheidet, ob Sie verbrauchen die Schlüssel-Ereignis. Sie müssen die Aktualisierung der Krankheit, so dass es nicht verbrauchen, das Punkt-Zeichen.
Gerade Recht-klicken Sie auf "TextField" /events /key /keytyped
/////////////
vielleicht helfen können, die Sie für die Filterung keytyped nur Anzahl und dot
Ich habe mit dieser Lösung, es ist einfach und effizient:
dies ist die einfachste Methode, die ich bis jetzt gefunden habe, und es funktioniert ohne Fehler