X
Xenya
Gast
Hallo,
ich habe eine Verständnisfrage zum Thema GUI-Änderungen via invokeLater anstoßen.
Alle Änderungen die die GUI betrifft sollte man ja Mittels invokeLater ausführen.
Soweit ich weiß, werden alle Aktivitäten von der GUI ebenfalls damit umgesetzt. Das heißt, die Methode die von einem Button-Klick oder von der Veränderung in einem Text-Field aufgerufen wird, laufen bereits als "invokeLater Thread". Ist dies richtig?
Muss ich in einem "invokeLater Thread" die GUI-Änderungen wieder per invokeLater aufrufen? Ich habe dies bis jetzt nicht gemacht, da ich dachte der "invokeLater Thread" von einem Button klick reicht.
Wenn dies doch nicht reicht, bedeutet es wenn ich 3 verschiedene Textfelder verändern will muss ich 3 invokeLater-Threads aufmachen?
Wie ich da im Moment darauf komme:
Meine GUI lief bis jetzt einwandfrei aber nun habe ich einen Funktion hinter der Änderung einer JList eingebaut, die mir Probleme macht. Hier erst mal die wichtigsten Codeschnipssel (falls ich was wichtiges weggelassen habe, sagt es):
Wenn ich nun was in der Liste anwähle und relativ zügig danach etwas in "textField" schreibe wird die folgende Fehlermeldung geworfen:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
(Exception wird ausgehend von der Zeile textField.setText(""); geworfen).
Habe mal gegoogelt und habe gelesen, dass man dies umgehen kann, wenn man die GUI-Änderungen in invokeLater aufruft. Da ich aber dachte, dass durch die beiden Listener es eh schon in einem "invokeLater Thread" läuft kann ich mir ein neues invokeLater sparen.
Bevor ich es nun abändere (weil ich dann viel nachziehen muss) wollte ich mir mit eurer Hilfe erstmal Klarheit verschaffen, was ich genau machen muss.
Danke für eure Tipps
ich habe eine Verständnisfrage zum Thema GUI-Änderungen via invokeLater anstoßen.
Alle Änderungen die die GUI betrifft sollte man ja Mittels invokeLater ausführen.
Soweit ich weiß, werden alle Aktivitäten von der GUI ebenfalls damit umgesetzt. Das heißt, die Methode die von einem Button-Klick oder von der Veränderung in einem Text-Field aufgerufen wird, laufen bereits als "invokeLater Thread". Ist dies richtig?
Muss ich in einem "invokeLater Thread" die GUI-Änderungen wieder per invokeLater aufrufen? Ich habe dies bis jetzt nicht gemacht, da ich dachte der "invokeLater Thread" von einem Button klick reicht.
Wenn dies doch nicht reicht, bedeutet es wenn ich 3 verschiedene Textfelder verändern will muss ich 3 invokeLater-Threads aufmachen?
Wie ich da im Moment darauf komme:
Meine GUI lief bis jetzt einwandfrei aber nun habe ich einen Funktion hinter der Änderung einer JList eingebaut, die mir Probleme macht. Hier erst mal die wichtigsten Codeschnipssel (falls ich was wichtiges weggelassen habe, sagt es):
Java:
JTextField textField = new JTextField();
textField.getDocument().addDocumentListener(new DocumentListener()
{
public void changedUpdate(DocumentEvent e)
{
//do something
}
public void removeUpdate(DocumentEvent e)
{
//do something
}
public void insertUpdate(DocumentEvent e)
{
//do something
}
});
JList list = new JList();
list.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent arg0)
{
textField.setText("");
}
});
Wenn ich nun was in der Liste anwähle und relativ zügig danach etwas in "textField" schreibe wird die folgende Fehlermeldung geworfen:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
(Exception wird ausgehend von der Zeile textField.setText(""); geworfen).
Habe mal gegoogelt und habe gelesen, dass man dies umgehen kann, wenn man die GUI-Änderungen in invokeLater aufruft. Da ich aber dachte, dass durch die beiden Listener es eh schon in einem "invokeLater Thread" läuft kann ich mir ein neues invokeLater sparen.
Bevor ich es nun abändere (weil ich dann viel nachziehen muss) wollte ich mir mit eurer Hilfe erstmal Klarheit verschaffen, was ich genau machen muss.
Danke für eure Tipps