IOC コンテナーとして Google Guice を使用して Java Swing アプリケーションに取り組んでいます。コンポーネントを直接注入していますが、これにより、Guice はEDT の外部にコンポーネントを作成できます。
アプリケーションは次のようになります。
private Panel1 panel1;
private Panel2 panel2;
@Inject
public class Application(Panel1 panel1, Panel2 panel2) {
this.panel1 = panel1;
this.panel2 = panel2;
}
hereとhereの質問を見て、コンポーネントを直接注入するのではなく、ローダーを注入するという結論に達しました。
private PanelLoader1 loader1;
private PanelLoader2 loader2;
private Panel1 panel1;
private Panel2 panel2;
@Inject
public class Application(PanelLoader1 loader1, PanelLoader2 loader2) {
this.loader1 = loader1;
this.loader2 = loader2;
loader1.load();
loader2.load();
this.panel1 = loader1.get();
this.panel2 = loader2.get();
}
public class PanelLoader {
private Panel panel;
public void load() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
panel = new Panel();
}
});
}
public Panel get() {
return panel;
}
}
これは正しいです?それを行うためのベストプラクティスはありますか?