Zeichen werden im JFormattedTextField überschrieben

Status
Nicht offen für weitere Antworten.

Brain

Aktives Mitglied
Hi!!

Weiß jemand, wieso die Zeichen im JFormattedTextField überschrieben werden?

Wenn ich z.B. Folgendes habe:

Code:
JFormattedTextField jftf = new JFormattedTextField("qwertz");

Wenn ich das Programm ausführe und fange an vor dem "q" zu tippen, dann werden die Zeichen nacheinander überschrieben, als hätte ich auf die Taste [Einfg] gedrückt.

Gibt es eine Methode, um das zu unterbinden?

Das Problem tritt auch auf, wenn das Programm während der Laufzeit Text in das JFormattedTextField eingefügt hat.

Danke.
 

thE_29

Top Contributor
Nur so ne Frage, wozu genau brauchst du das JFormatted?

Gehts nicht auch mit nem normalen JTextField und Dokumenten (sieh FAQ JTextField und DokumentArten)
 
I

importantperson

Gast
Genau diesem Problem steh ich jetzt auch gegenüber. Hab hier leider aber noch keine Lösung gefunden, weiß jemand da vielleicht was?
 

*Hendrik

Bekanntes Mitglied
Da ich mich etwas mit dem JFormattedTextField beschäftigt habe, möchte ich mal eine Antwort für andere Suchende geben (und vielleicht gibts ja von anderer Seite noch weitere Hinweise dazu?).

Dem JFormattedTextField kann bei der Initialisierung ein AbstractFormatter mitgegeben werden. Tut man dies nicht, so bekommt das JFormattedTextField automatisch den DefaultFormatter (javax.swing.text.DefaultFormatter).

Also:

Code:
javax.swing.JFormattedTextField ft = new javax.swing.JFormattedTextField(new javax.swing.text.DefaultFormatter());

Beim DefaultFormatter steht der Überschreibmodus standardmäßig auf true. Soll das Überschreiben unterbunden werden, muss man also Folgendes tun.

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

DefaultFormatter df = new DefaultFormatter();
df.setOverwriteMode(false);                                 //Deakiviert den Überschreibmodus

JFormattedTextField ft = new JFormattedTextField(df);


Abgekürzt könnte man auch schreiben:

Code:
((DefaultFormatter)ft.getFormatter()).setOverwriteMode(false);

Da getFormatter() nur AbstractFormatter zurückgibt, muss ein Casting ausgeführt werden, sonst kommt man nicht an die setOverwrite()-Methode. Statt mit dem DefaultFormatter kann natürlich auch ein anderer verwendet werden.


Mein eigenes Problem war/ist das Verhalten des JFormattedTextField, was das Begrenzen auf eine bestimmte Anzahl Stellen angeht.

Gebe ich dem JFormattedTextField einen NumberFormatter oder ein NumberFormat mit und begrenze die Stellen mit setMaximumIntegerDigits(), so funktioniert das zwar, allerdings können mehr Stellen eingeben werden, als mit setMaximumIntegerDigits() angeben - die Stellen die zuviel eingeben wurden, werden erst beim Verlassen des Feldes abgeschnitten. Außerdem können ebenfalls Buchstaben eingeben werden, die dann beim Verlassen des Feldes gelöscht werden.

Die Verwendung eines MaskFormatters habe ich genauso ausgeschlossen, da hierbei das Verhalten des Feldes m. E. nicht sehr schön ist. So kann man beliebig in des Feld hineinklicken und der Cursor steht dann dort, statt am Anfang des Feldes - auch wenn nichts im Feld drin steht. Dies liegt offensichtlich am Placeholder, der per Default ein Leerzeichen ist. Somit ist das Feld von vornherein mit diesem Platzhalter gefüllt und ich kann an jede Stelle in dem Feld klicken, an dem ein Leerzeichen steht.

Will ich bei einem JTextField die Anzahl der Stellen eingrenzen, so erweitere ich einfach das PlainDocument und überschreibe die Methode insertString(). Dort prüfe ich dann, ob der String länger ist als zugelassen, wenn nein, dann rufe ich super.insertString() auf, wenn ja, dann eben nicht. Genauso kann ich in insertString() prüfen, was ich als Eingabe zulassen möchte (Buchstaben, Zahlen usw.). Da insertString() bei jeder Eingabe im Feld aufgerufen wird, erfolgt die Prüfung auf Länge (oder Art) sofort und nicht erst nach Verlassen des Feldes. Mit setDocument() kann ich meinem JTextField dann mein erweitertes PlainDocument zuweisen.

Will ich das Gleiche beim JFormattedTextField machen, so habe ich ein Problem. Es funktioniert nicht. Zwar kann ich mit setDocument() mein erweitertes PlainDocument zuweisen, allerdings bleibt dies ohne Auswirkung. Dies liegt daran, dass beim JFormattedTextField der DefaultFormatter mit im Spiel ist. Dieser hat eine Methode getDocumentFiler() (protected), die immer den DefaultDocumentFilter zurückliefert. Irgendwann/Irgendwo wird diese Methode aufgerufen und mein erweitertes PlainDocument bekommt diesen DefaultDocumentFilter zugewiesen - denke ich zumindest. Und ist einem Document ein DocumentFilter zugewiesen, so laufen alle Aufrufe von insertString() über den Filer und meine insertString()-Methode in meinem erweiterten PlainDocument ist ohne Wirkung. Das explizite Setzen eines anderen Document Filters mit
Code:
((PlainDocumentExtended)ft.getDocument()).setDocumentFilter(new MyDocumentFilter())
hilft auch nicht weiter.

Ich kann nur
1. Einen einen eigenen Formatter schreiben, indem ich z.B. den DefaultFormatter erweitere und die getDocumentFilter()-Methode überschreibe und meinen eigenen DocumentFilter zurückgebe

oder
2. In meinem erweiterten PlainDocument die Methode setDocumentFilter() überschreibe und dort ebenfalls meinen eigenen DocumentFilter weitergebe.

Erst dann habe ich ein Verhalten wie beim Textfeld.

Dabei stellt sich mir allerdings die Frage, für was ich dann noch das JFormattedTextField benötige und warum ich nicht gleich auf einem JTextField aufsetzen sollte und die nötige Funktionalität in meiner insertString() Methode hinterlege? Daneben muß ich zusätzlich noch darauf achten, dass ich beim JFormattedTextField getValue() und nicht getText() verwende, um auf den Inhalt des JFormattedTextField zuzugreifen (ist natürlich nicht zwingend notwendig). Dabei sollte die Methode commitEdit() nicht vergessen werden, mit der der Inhalt des JFormattedTextField nach value übertragen wird.

Also sind meine Fragen:

1. Hat jemand noch weitere interessante Erkenntnisse zum JFormattedTextField?

2. Wann ist es wirklich sinnvoll bzw. wann sollte man ein JFormattedTextField einem JTextField vorziehen?


mfg

Hendrik
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A 2D-Grafik Zeichen werden über unabhängingen JRadioButton nicht gefüllt AWT, Swing, JavaFX & SWT 28
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Swing Tastatur zeichen AWT, Swing, JavaFX & SWT 4
I JOptionPane maximale Zeichen einstellen AWT, Swing, JavaFX & SWT 2
L JavaFX ASCII Zeichen /char von KeyEvent erhalten AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
C JavaFX Tiefgestellte Zeichen in fxml AWT, Swing, JavaFX & SWT 2
B EventHandler für durch Tastenkombination erzeugte Zeichen AWT, Swing, JavaFX & SWT 3
L Ausgabe in JEditorPane mittels HTMLEditorKit zeigt auf bestimmten Systemen falsche Zeichen AWT, Swing, JavaFX & SWT 1
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
A Zeichen-Steuerelement in Swing AWT, Swing, JavaFX & SWT 0
kaoZ Swing Aktives Zeichen für Spieleprogrammierung ? AWT, Swing, JavaFX & SWT 8
D Swing Manuellen Kreis zeichen AWT, Swing, JavaFX & SWT 22
U Label zeigt nicht überall HTML Zeichen AWT, Swing, JavaFX & SWT 3
R einzelne Zeichen in jTable einlesen AWT, Swing, JavaFX & SWT 10
S SWT [TextBox] Bestimmtes Zeichen entfernen unterbinden AWT, Swing, JavaFX & SWT 3
P readLine solange es mit einem bestimmten Zeichen anfängt AWT, Swing, JavaFX & SWT 5
P Komische Zeichen beim Abspeichern von TextFelder AWT, Swing, JavaFX & SWT 2
Jats Zeichen auf mehrere JPanels AWT, Swing, JavaFX & SWT 7
P 2D-Grafik versch. Rectangles aus array von textfelder zeichen AWT, Swing, JavaFX & SWT 6
DEvent Swing JTextField Anzahl an sichtbaren Zeichen AWT, Swing, JavaFX & SWT 4
D JLabel und JPanel -> Neu zeichen?! oO AWT, Swing, JavaFX & SWT 2
E jTextFiled max 160 Zeichen? AWT, Swing, JavaFX & SWT 4
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
A Rechteck zeichen AWT, Swing, JavaFX & SWT 4
Q AWT Choice ein Zeichen hinzufügen AWT, Swing, JavaFX & SWT 4
J 2D-Grafik Textbasiertes 2D Spiel, jedes Zeichen manipulierbar AWT, Swing, JavaFX & SWT 7
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
T Zeichen/char in Bild umwandeln und darstellen AWT, Swing, JavaFX & SWT 10
2 Bücher über Zeichen und Baumalgorithmen AWT, Swing, JavaFX & SWT 5
T Zeichen zählen JTextPane AWT, Swing, JavaFX & SWT 4
F Zeichen per Menuitem funktioniert nicht AWT, Swing, JavaFX & SWT 2
V Nur zulässige Zeichen in JTable-Zellen eintragen können AWT, Swing, JavaFX & SWT 2
P Swing Probleme beim Zeichen AWT, Swing, JavaFX & SWT 6
aze JTextfield nur so breit dass alle zeichen sichtbar sind AWT, Swing, JavaFX & SWT 2
3TageBart Ebenen in Zeichen-Programm implementieren AWT, Swing, JavaFX & SWT 9
P Zeichen abhängig davon, ob sich eine Variable geändert hat AWT, Swing, JavaFX & SWT 2
G Blinkenden Punkt zeichen AWT, Swing, JavaFX & SWT 2
G Viele Fehler beim zeichen AWT, Swing, JavaFX & SWT 5
J JTextPane mit genau 80 Zeichen breite definieren? AWT, Swing, JavaFX & SWT 3
J jTextarea Anzahl Zeichen in einer Zeile begrenzen AWT, Swing, JavaFX & SWT 2
Lazybone CMYK Zeichen AWT, Swing, JavaFX & SWT 12
H Polyline zeichen, aber wie? AWT, Swing, JavaFX & SWT 2
D jTable ausdrucken => € zeichen wird nicht richtig angezei AWT, Swing, JavaFX & SWT 7
H Problem beim zeichen eines TimeSeriesChart mit jfreechart AWT, Swing, JavaFX & SWT 5
K UNICODE ZEICHEN in den SWing-GUIs AWT, Swing, JavaFX & SWT 4
B Dreiecke zeichen AWT, Swing, JavaFX & SWT 3
D Zeichen ein Pixel mit Java2D AWT, Swing, JavaFX & SWT 15
C JFormattedTextField - nur bestimmte Zeichen zulassen AWT, Swing, JavaFX & SWT 3
F Zeichen von Linien, Rechtecken, zb wie in paint AWT, Swing, JavaFX & SWT 2
C PI-Zeichen im JLabel AWT, Swing, JavaFX & SWT 3
G Zeilenumbruch nach n Zeichen in JTextArea AWT, Swing, JavaFX & SWT 24
U kleiner-Zeichen JEditorPanel (war: JOptionPane) AWT, Swing, JavaFX & SWT 5
T JLayerdPane: wie etwas über eine AWT Komponente zeichen? AWT, Swing, JavaFX & SWT 2
N Tastatur Zeichen einlesen ohne sichtbares Fenster AWT, Swing, JavaFX & SWT 8
D JTextPane: "Nichtdruckbare Zeichen" anzeigen & AWT, Swing, JavaFX & SWT 4
R letztes Zeichen aus textfeld auslesen AWT, Swing, JavaFX & SWT 2
M rendern von zeichen AWT, Swing, JavaFX & SWT 4
R Zeichen-Markierungrahmen AWT, Swing, JavaFX & SWT 5
F Eingabe in JPasswordField auf vier Zeichen beschränken AWT, Swing, JavaFX & SWT 3
M Transparentes gif als extra Klasse auf einen JFrame zeichen AWT, Swing, JavaFX & SWT 17
B ComboBox: nur bestimmte Zeichen zulassen AWT, Swing, JavaFX & SWT 5
G Linien in ein Koordinatensystem zeichen AWT, Swing, JavaFX & SWT 7
H funktionen in ein koordinatensystem zeichen AWT, Swing, JavaFX & SWT 5
B Erstes Zeichen in einem String toUpperCase ??? AWT, Swing, JavaFX & SWT 4
bummerland ein zeichen nach einem zeilenumbruch einfügen AWT, Swing, JavaFX & SWT 4
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
melaniemueller JavaFX Beispiel kann nicht ausgeführt werden AWT, Swing, JavaFX & SWT 4
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
W Können Animationen in JavaFX "verschluckt" werden? AWT, Swing, JavaFX & SWT 8
M Umwandlung in den HSV-Farbraum lässt die Grafik pixelig werden AWT, Swing, JavaFX & SWT 8
H JButtons werden nicht angezeigt AWT, Swing, JavaFX & SWT 5
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
B JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt? AWT, Swing, JavaFX & SWT 3
ProggersWorld JavaFX Icons im TreeView werden nicht angezeigt AWT, Swing, JavaFX & SWT 1
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
J e(fx)clipse funkioniert nicht / imports werden Rot gekennzeichnet AWT, Swing, JavaFX & SWT 1
ronbot77 JavaFX Rechtecke werden nicht neu gezeichnet AWT, Swing, JavaFX & SWT 8
R FXML File kann nicht hinzugefügt werden! AWT, Swing, JavaFX & SWT 2
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
H String teilen, damit bei JLabel keine Punkte am Ende angezeigt werden AWT, Swing, JavaFX & SWT 4
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
L Image kann nicht gefunden werden AWT, Swing, JavaFX & SWT 1
L Bilder werden in exportierter Datei nicht geladen AWT, Swing, JavaFX & SWT 6
J Bilder aus dem SceneBuilder werden in der Jar nicht dargestellt AWT, Swing, JavaFX & SWT 4
TheWhiteShadow JavaFX Bilder werden ungewollt Skaliert AWT, Swing, JavaFX & SWT 1
MoxxiManagarm JavaFX Auch ich versuche mit JavaFX warm zu werden AWT, Swing, JavaFX & SWT 9
L Swing JPanels werden nicht angezeigt! AWT, Swing, JavaFX & SWT 7
ralfb1105 Swing SwingWorker - max 10 Threats werden gestartet !? AWT, Swing, JavaFX & SWT 5
S Fehler: Hauptklasse neon.Main konnte nicht gefunden oder geladen werden AWT, Swing, JavaFX & SWT 5
A Swing Meine JButtons werden nicht angezeigt bitte helft mir AWT, Swing, JavaFX & SWT 2
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
SchmidiMC 2D-Grafik Grafiken werden nicht gezeichnet AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben