JTextField.setText in JTextFields eines anderen Threads?

...komplette Frage anzeigen

2 Antworten

Ändere den Konstruktor von Concurrent so, dass du ein MainClass objekt, namentlich das Fenster, auf dem du arbeiten möchtest, übergibst. Beim derzeitigen Code erzeugst du lediglich ein weiteres objekt, was aber nicht angezeigt wird..

Ausserdem solltest du beachten, dass Swing nicht thread-safe ist. Jede änderung der UI sollte auf dem Event-Thread gemacht werden. Um das zu tun kannst du die Aktion als Runnable an die Funktion SwingUtilities.invokeLater() übergeben. Sie wird dann in eine Warteschlange eingereiht und diese wird auf dem Eventthread abgearbeitet.

Unter Java 8 kannst du dafür einfach einen Lambdaausdruck verwenden:

SwingUtilites.invokeLater(() -> clientObject.showMessage(i));

Siehe auch: https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingUtilities.html#invokeLater-java.lang.Runnable-

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Eurocrafter
29.10.2016, 11:55

Zu Punkt 1: Ich hab mal dem Konstruktor von Concurrent das MainClass-Object frame übergeben. Funktioniert super, danke.

Zu Punkt 2: Wenn der Concurrent-Thread der einzige ist, der auf das JTextField zugreift, sollte das Problem, dass Swing nicht thread-safe ist, eigentlich vernachlässigbar sein, oder?

Mit Lambda-Ausdrücken hab ich glaube ich noch nie gearbeitet...

0
Kommentar von Eurocrafter
29.10.2016, 21:52

Ja stimmt, n JLabel wäre hier besser. In meinem richtigen Programm nutze ich allerdings ne JTextArea, bei der ich setEditable(false) gesetzt habe

0

Wieso benötigst du für diese Aufgabe einen eigenen Thread? Dafür gibt es doch bereits Implementationen von Java: http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_14_007.htm#mjb1126ef61ae8b4987d341b8b5ca908bb

Zumal du Prozesse aus dem Main-Thread, welche du in einem anderen Thread ausführen lässt, synchronisiert ausführen solltest (!). Sonst können sich Wertänderungen überschneiden. Momentan beachtest du diesen Fall überhaupt nicht.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Eurocrafter
29.10.2016, 20:54

Klar, ich könnte natürlich auch nen Timer verwenden. In Wirklichkeit ist mein Code aber ein ganz anderer. Diesen hier habe ich lediglich zusammengestellt, um wenig Code und ein Beispiel für mein Problem zu haben.

In diesem Fall sollte doch aber das synchronisieren überflüssig sein, da der Concurrent-Thread der einzige ist, der überhaupt Wertänderungen vornimmt.

Bei mehreren Threads kann ich das nachvollziehen. Da kann man aber auch die kritischen Abschnitte z.B. mit einem ReentrantLock sperren.

0

Was möchtest Du wissen?