Zwar läuft JavaFX nur im FX-Thread, dennoch müssen Funktionalitäten, die mit der Darstellung zu tun haben, im AWT-Tread ausgeführt werden. Das betrifft z.B. das Hinzufügen von Layern oder das Einblenden von Ergebins-Layern.
Der Grund ist, dass aus einem anderen Tread als aus dem AWT-Tread heraus aufgerufen, das Runnable in einer nicht vorhersehbaren Reihenfolge abgearbeitet wird. So passiert es unter anderem, dass ein leerer „ColorThemingStyle“ gefunden wird, obwohl dieser eine Liste von Label enthalten sollte. Dies passiert, da der Ergebnislayer gezeichnet wird, bevor der „ColorThemingStyle“ fertig gestellt wurde, obwohl dieser Befehl zuvor erteilt wurde. Im AWT-Tread aber ausgeführt, wird alles in der richtigen Reihenfolge abgearbeitet.
Dies umzusetzen ist leicht. Das Aufrufende Programm, meist der Controller einer JavaFX-Maske, das im FX-Tread läuft muss die auszuführenden Befehle in einem neuen Runnable ausführen, das im AWT-Tread laufen soll.
Muster:
Java |
---------- |
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
{…}Plugin {…}plugin = new {…}Plugin ();
try {
{…}plugin.execute(getSwingToFxView().getContext());
} catch (Exception ex) {
logger.error("An error occured: " + ex.toString());
ex.printStackTrace();
}
}
});
Dabei hat es sich als günstig herausgestellt, wenn das Runnable „StandardManuelaUIPlugin“ erweitert, da es dann auch von Außen zur Aktualisierung von Daten angestoßen werden kann.