JTextField, DocumentListener, Fehler bei setText()

Goldi

Aktives Mitglied
Hi Leute,

ich möchte gerne die Swing-Kompenenten für mich etwas erweitern, z. B. mit einem Textfeld, das nur für Zahlen vorgesehen ist und andere Ziffern gar nicht erst zulässt. Ich dachte mir also: :idea: Melde ich einen DocumentListener an, prüfe nach jedem mal Tippen über die Methode
Code:
insertUpdate
des Listeners, ob das Feld noch eine gültige Zahl ist und falls nicht, wird das zuletzt eingetippte Zeichen (das muss ja der Übeltäter sein) einfach wieder gelöscht und die CurretPosition um 1 zurück gesetzt.

Der Mist ist :shock::
Java:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
	at javax.swing.text.AbstractDocument.writeLock(Unknown Source)
	at javax.swing.text.AbstractDocument.replace(Unknown Source)
	at javax.swing.text.JTextComponent.setText(Unknown Source)
	at GoldisSwing.BspJTextField.insertUpdate(BspJTextField.java:19)
        ... (da kommt noch viel mehr) ...

Das Problem scheint wohl zu sein, dass der Konflikt der setText-Methode damit zusammenhängt, dass sie innerhalb der insertUpdate-Methode aufgerufen wird. Natürlich hab ich recherchiert und etwas (leider nicht viel) über eine Methode "invokeLater" erfahren, die aufgerufen werden müsse und über eine EventQueue-Klasse. Ich habe versucht, mich in meinen Büchern und auf den einschlägigen Seiten und auch hier im Forum darüber zu informieren. Aber in deutscher Sprache ist die Info dazu eher rar und mit meinem awful English habe ich nicht so viel kapiert, dass ich es anwenden könnte. Hiiiiilfeeeee!!

Ich will Euch nicht mit meinem ellenlangen Code die Zeit stehlen, deshalb hier ein sehr kleines Beispiel als Quintessenz. Es ist zwar vom Ergebnis her unsinnig, aber entscheidend ist: Die setText-Methode innerhalb der insertUpdate-Methode schlägt mit obiger Meldung fehl. Übrigens: Listener abmelden, Text ändern und Listener wieder anmelden bringt keine Besserung. Was muss ich tun, damit das funzt?

Java:
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;

public class BspJTextField extends JTextField implements DocumentListener {

	public BspJTextField(int columns) {
		super(columns);
		getDocument().addDocumentListener(this);
	}

	@Override
	public void insertUpdate(DocumentEvent e) {
		/* Sobald etwas in das Textfeld getippt wird, wird der Textinhalt einfach
		 * ein 2. Mal hinten angehängt: */
		String inhalt = getText();
		setText(inhalt + inhalt);
	}
	
	
	// Nicht benötigte Methoden aus DocumentListener:
	@Override
	public void changedUpdate(DocumentEvent e) {}

	@Override
	public void removeUpdate(DocumentEvent e) {}
}

Vielen Dank schon mal im Voraus.

Gruß
Goldi
 

eRaaaa

Top Contributor
Hi Leute,

ich möchte gerne die Swing-Kompenenten für mich etwas erweitern, z. B. mit einem Textfeld, das nur für Zahlen vorgesehen ist und andere Ziffern gar nicht erst zulässt.

Da könntest du z.B. einen DocumentFilter nutzen, ein Beispiel (Pattern anpassen) ist hier zu finden: http://www.java-forum.org/bilder-gu...7213-jtextfield-dokumentarten.html#post587501


p.s.: Mit invokeLater hat dein Problem nichts zu tun. Du solltest dir, wenn es dich interessiert, mal ein wenig auf Text Component Features (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components) einlesen. Eine Textkomponenten, oder generell Swingkomponenten besitzen eine View und ein Model (Document). Du bist hier schon auf der Ebene des Models / Documents und willst dieses nun in der insertUpdate ändern, rufst nun aber wieder eine Methode der View/Controllers auf um das Document zu ändern...macht keinen Sinn und würde nur zu einer Endlosschleife führen!
 

Goldi

Aktives Mitglied
Servus Basti,

ich hab's zwar nicht auf Anhieb hingekriegt ;(, aber mit einigem Lesen und Probieren: Hat geklappt :applaus:. Danke für die richtige Wegweisung (weg vom Holzweg :D).

Besten Gruß
Goldi
 

Goldi

Aktives Mitglied
Peinlich, peinlich, ich hab die Tage einen neuen Thread zum gleichen Thema aufgemacht. Dass ich vor gut einem Jahr schon mal um Hilfe gebeten habe ... ich werde alt!!! ;( Also tschuldigung, an alle, die das nervt. Ich kann mich auch an die Lösung nicht mehr erinnern ... jetzt hab ich aber eine, die wesentlich einfacher geht als der DocumentListener. für alle die's interessiert (und für mich in ca. 1 Jahr :oops:):

Man nehme den UndoableEditListener!

Klassendefinition:
Code:
public class xyz
extends JTextField
implements UndoableEditListener

Konstruktur:
Code:
public xyz() {
		...
		getDocument().addUndoableEditListener(this);
	}

Ereignismethode:
Code:
/* Wenn das ganze Textfeld ungültig ist (z. B. nicht numerisch für Zahlenfelder), 
 * muss das letzte eingetippte Zeichen dazu geführt haben: */
public void undoableEditHappened(UndoableEditEvent e) {
	String inhalt = getText();
	if (<inhalt erfüllt nicht die Gültigkeitsregeln>)
			e.getEdit().undo();
	}

Gruß
Goldi
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
S Möglichkeit, mit g.draw etwas vor ein JTextfield zu „zeichnen“? Java Basics - Anfänger-Themen 7
I ResultSet aus meiner SQL-Abfrage in einem JTextfield ausgeben. Java Basics - Anfänger-Themen 1
S ArrayList Username und passwort mit JTextField eingaben abgleichen Java Basics - Anfänger-Themen 10
B Variablen Int Variabel in JTextField ändern Java Basics - Anfänger-Themen 2
mhmt_03 dafür sorgen, dass im JTextfield nur zahlen eingebbar sind Java Basics - Anfänger-Themen 9
M JTextField nur Zahleneingaben zulassen, eingabe sperren Java Basics - Anfänger-Themen 24
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
CptK 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 17
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
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

Ähnliche Java Themen

Neue Themen


Oben