5

IOC コンテナーとして Google Guice を使用して Java Swing アプリケーションに取り組んでいます。物事はかなりうまくいっています。いくつかの UI の問題があります。標準の L&F が Pushing pixel に置き換えられると、UI スレッド外で Guice の Swing コンポーネントが作成されるため、Substance L&F アプリケーションが実行されません。

GUI スレッドで Swing コンポーネントを作成するように Guice に指示する方法はありますか?

作成後に Swing コンポーネントを返すカスタム プロバイダを作成する必要があるかもしれませんSwingUtilities.invokeAndWait(Runnable)

アプリケーション全体を UI スレッドで実行するという考えは好きではありませんが、おそらくそれは完璧な解決策です。

4

3 に答える 3

5

IMO Guice を使用してコンポーネントを作成するのではなく、コンポーネントを作成するサービスを作成する必要があります。サービスを注入したら、コンポーネントの作成が EDT で行われることを確認するのは簡単です (を使用invokeAndWait) 。

于 2010-04-28T13:03:23.933 に答える
1

私のGuts-GUIプロジェクト(Guiceに基づいて構築されたSwingアプリフレームワーク)を確認することをお勧めします。Guts-GUIは、Guiceによって作成された場合でも、コンポーネントがEDTで作成されていることを確認します。

Guice自体は、EDTで作成されるコンポーネントを宣言する方法を箱から出して提供していません。Guice Scopesをそのために使用できるかどうかはわかりませんが(そうだと思います)、特にパフォーマンスに関して、Scopeベースのソリューションが価値があるかどうかはわかりません。

この問題を解決するための最初のステップは、GuiceインジェクターがEDT内から作成されていることを確認することです(SwingUtilities.invokeAndWaitまたはinvokeLaterを使用して)。これは、Guts-GUIが最初に行うことです。したがって、一部のコンポーネントがGuiceによって早期に作成された場合、それらはEDTで作成されます。

次に、Guiceによって注入され、注入されたSwingコンポーネントの作成が必要なインスタンスがInjector.getInstance(...)EDTから取得されていることを確認する必要があります(たとえば、を通じて)。

于 2010-05-03T05:53:44.867 に答える
0

実際、Swing はマルチスレッドではなく、EDT で実行する必要があります。結果として、はい、コンポーネントは を呼び出して EDT で準備する必要がありますinvokeAndWait

于 2010-04-28T09:17:03.803 に答える