Frage wegen java.lang.IllegalStateException bei DocumentListener

Diskutiere Frage wegen java.lang.IllegalStateException bei DocumentListener im AWT, Swing, JavaFX & SWT Bereich.
pkm

pkm

Ich bin gerade dabei, einen Taschenrechner zu programmieren, und mein Plan ist der, dass ich in dem Moment, da in das JTextField des Taschenrechners ein mathematischer Term (den ich dann noch an anderer Stelle parsen will, dass es sich überhaupt um ein valides Ding handelt) eingegeben wird, der mit „=“ aufhört, dieser Term berechnet wird. Das Ergebnis der Berechnung schreibe ich dann in das JTextField hinein. Problem dabei ist Folgendes:

Ich greife die Änderungen im JTextField durch einen Dokumentlistener wie folgt ab:

Java:
      jtextField.getDocument().addDocumentListener(new DocumentListener() {



            public void changedUpdate(DocumentEvent e) {



                readTerm();



            }

            public void removeUpdate(DocumentEvent e) {



                readTerm();



            }






            public void insertUpdate(DocumentEvent e) {



                readTerm();



            }



...


Wenn sich in dem Textfeld also die Eingabe ändert, dann soll eine Methode namens readTerm() aufgerufen werden. Diese liest den eingegebenen Term ein und tut Folgendes:


Java:
    public void readTerm() {



                try {






                                //Lies den Term im Textfeld.



                    String term = jtextField.getText();






                    if (term != null && term != "" && term.endsWith("="))



                               {






                         //Schmeiß das „=“ am Ende weg.



                        term = term.substring(0, term.length() - 1);






                //Berechne mir das Ergebnis in der evalErgebnis-Fuktion.



                        Eval.getInstance().evalErgebnis(term);






                //Setze den Term auf null zurück.



                        term = "";






                    }






                } catch (Exception e) {






                    e.printStackTrace();



                }



            }
Das Problem ist folgendes – wie bekomme ich das Ergebnis, das in der Methode evalErgebnis berechnet wird, in das Textfeld, ohne dass die JVM durch eine java.lang.IllegalStateException: Attempt to mutate in notification - Exception motzt, dass das Textfeld nicht verändert werden soll? Gibt es da einen Hack?

Gerne poste ich meinen kompletten Code, wenn dies nötig ist. Vielen Dank im Voraus für Tipps. :)
 
J

JustNobody

Hast du es mal mit invokeLater ausprobiert? Damit wird der Ausdruck erst im Anschluss als nächstes Event gesetzt. Die Idee ist zwar von invokeLater, dass man etwas in dem UI Thread ausführt, aber so ich das richtig verstanden habe, sollte es in dem Fall auch funktionieren....

Aber ich habe da auch nicht ganz so viel Erfahrung mit Swing, da ich vor allem Backend mache. Aber ein Versuch ist es auf jeden Fall wert.
 
L

LimDul

Wo fliegt den genau die Exception?

Und bitte, bitte weniger Leerzeilen posten im Code, so ist es unübersichtlich :)
 
pkm

pkm

Vielen Dank für die rasche Antwort und den ersprießlichen Tipp! Ich habe invokeLater() nun wie folgt in den Code eingebunden:

Java:
        jtextField.getDocument().addDocumentListener(new DocumentListener() {
            public void changedUpdate(DocumentEvent e) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                       readTerm();
                    }
                  });
            }

            public void removeUpdate(DocumentEvent e) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                       readTerm();
                    }
                  });
            }

            public void insertUpdate(DocumentEvent e) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                       readTerm();
                    }
                  });
            }

            public void readTerm() {
                try {

                    String term = jtextField.getText();

                    if (term != null && term != "" && term.endsWith("=")) {

                        term = term.substring(0, term.length() - 1);

                        String res = (String) Eval.getInstance().evalErgebnis(term);
                        jtextField.setText(res);
                        term = "";

                    }

                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        });
 
J

JustNobody

Wenn es funktioniert, ist es super. Ich hätte es evtl. Innerhalb von readTerm gemacht und den Inhalt des if Blocks über invokeLater aufgerufen.

Aber wenn es funktioniert haben wir erst einmal vom Prinzip her eine Lösung gefunden.
 
Thema: 

Frage wegen java.lang.IllegalStateException bei DocumentListener

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben