package com.maxifier.guice.scope; import com.google.inject.Provider; import javax.swing.*; import java.lang.reflect.InvocationTargetException; class UIProvider<T> implements Provider<T> { private Provider<T> provider; UIProvider(Provider<T> provider) { this.provider = provider; } @Override public T get() { if (SwingUtilities.isEventDispatchThread()) { return provider.get(); } else { final Object[] t = new Object[1]; try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { t[0] = provider.get(); } }); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } //noinspection unchecked return (T) t[0]; } } @Override public String toString() { return "XScopes.UI_SINGLETON"; } }