Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: "Christian H. Kuhn" Newsgroups: de.comp.lang.java Subject: =?UTF-8?Q?Re:_GUI-Update_=c3=bcber_Swing-EDT?= Date: Sat, 16 Jul 2016 15:24:52 +0200 Lines: 71 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net KNMMDkGDNESegFJ1Qkl/OQpxQcsvT3g1G9YVbYayp/jU0ZdjI= Cancel-Lock: sha1:RQl0h+27N58XexCJtggZsWwsu+k= User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 In-Reply-To: Xref: csiph.com de.comp.lang.java:13000 Am 15.07.2016 um 22:43 schrieb Patrick Roemer: > https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html Ich hab nachher ne Stunde S-Bahn vor mir, da lese ich das. Bis dahin machen mich Zugriffsrechte wahnsinnig. > #getChildIndexed() & Co. gehören auch > dahin. Genau. getName() ist in meiner Anwendung unkritisch, weil Namen von GUI-Komponenten nur im Konstruktor gesetzt und nie mehr verändert werden, da entstehen keine Konflikte, solange nicht lesend auf ein noch nicht fertig konstruiertes Objekt zugegriffen wird. Ich hoffe, dass die VM sowas verhindert und ein Objekt erst da ist, wenn der Konstruktor fertig ausgeführt ist? Aber TestUtils soll ja allgemeint verwendbar sein, also muss auch getName() abgesichert werden. public final class TestUtils { private static String staticName; public static Component getChildNamed(final Component _parent, final String _name) { class Test { private Object object; public void setObject(final Object _object) { object = _object; } } String name; StringBuilder nameBuilder = new StringBuilder(); try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { _parent.getName(); // das geht name = _parent.getName(); // das geht nicht test.setObject(_parent.getName()); // das geht staticName = _parent.getName(); // das geht nameBuilder.append(_parent.getName()); // das geht } }); } catch (InvocationTargetException | InterruptedException e) { // TODO } if (_name.equals(_parent.getName())) { return _parent; } (...) } } run() kann also auf die Variablen der Umgebung, aus der invokeAndWait() aufgerufen wird, lesend zugreifen, nicht aber nicht zuweisen. run() kann statischen Variablen der Klasse zuweisen. Ergebnisausgabe in eine statische Variable der Klasse versorgt mich wieder mit eben den Konkurrenzsituationen, die ich eigentlich lösen möchte. Ansonsten kann run() anscheinend Variablen von außerhalb keinen Wert zuweisen. Es können aber deren Methoden aufgerufen werden. Also muss ich außerhalb ein geeignetes Objekt instantiieren und dem einen Wert zuweisen (hier einen leeren Stringbuilder, Wert wird mit append() gesetzt; für einen int fällt mir schon nichts einfaches mehr ein). Gibt es kein geeignetes Objekt, funktioniert die o.g. Klasse Test. Gibt es da denn keinen einfachen Weg? lg QNo