JTextField in Listener leeren

Tharsonius

Bekanntes Mitglied
Hallo zusammen,

ich habe ein Problem mit einem JTextField. Dazu passend mal folgender Sourcecode Ausschnitt:

Java:
private JTextField teilenummer;

...

private void fuelleFenster()
{
...
	teilenummer = new JTextField();
	teilenummer.setFont(new Font("SansSerif", Font.PLAIN, 24));
	teilenummer.setSize(200, 30);
	teilenummer.setLocation(300, 50);
	teilenummer.getDocument().addDocumentListener(this);
...
}

public final void insertUpdate(DocumentEvent e)
{
	aenderungTextBox();
}

public final void removeUpdate(DocumentEvent e)
{
	aenderungTextBox();
}

private final void aenderungTextBox()
{
...
	teilenummer.setText("");     // Problemzeile
	teilenummer.grabFocus();
...
}

In der Problemzeile bekomme ich immer eine Exception:

java.lang.IllegalStateException: Attempt to mutate in notification
at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1323)
at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:644)
at javax.swing.text.JTextComponent.setText(JTextComponent.java:1693)
at produktion.ap662ff.fenster.Funktionstest.aenderungTextBox(Funktionstest.java:1464)
at produktion.ap662ff.fenster.Funktionstest.insertUpdate(Funktionstest.java:1404)
at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:185)
at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:734)
at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:693)
at javax.swing.text.PlainDocument.insertString(PlainDocument.java:114)
at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:655)
at javax.swing.text.JTextComponent.replaceSelection(JTextComponent.java:1351)
at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(DefaultEditorKit.java:859)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2844)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2879)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2807)
at java.awt.Component.processEvent(Component.java:5815)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:958)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:830)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657)
at java.awt.Component.dispatchEventImpl(Component.java:4282)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)


Soweit ich das verstehe ist das Textfeld gesperrt, wenn ich mich gerade in dem passenden Listener befinde. Ich kann also nichts rein schreiben.

Ich muss das Feld aber nun löschen, stehe da gerade ziemlich auf dem Schlauch.
Gibt es da eine andere Möglichkeit den Inhalt zu löschen?

Kann mir da vielleicht jemand einen Tip geben wie ich das ganze machen kann?

Mir ist spontan eingefallen einen Timer zu starten, der 100 Millisekunden danach das Feld löscht, wenn ich aus dem Listener raus bin, aber irgendwie kommt mir das auch nicht als beste Lösung vor.
 
Naja ein Timer muss wohl nicht sein. Vermutlich würde es schon reichen, das ganze mit
Code:
SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {   
        teilenummer.setText("");     // Problemzeile
    }
});
auf die Event Queue zu legen, dann wird es abgearbeitet sobald er mit der eigentlichen Behandlung des ursrpünglichen Events fertig ist. Aber man könnte mal genauer überlegen, ob es da eine noch alternative Lösungen gibt...
 

Zurück
Oben