[英]Java Swing Dependency Injection
我有一個Swing GUI,它是使用Netbeans構建的,到目前為止,它一直使用靜態引用與其他類進行通信。
+----------------------+ | MainClass (static) | |----------------------| +------+ -DataList +-----+ | | | | static| +-+--------------+-----+ |static reference | | |reference | |new () | new () | | | | | | | | | +-+--------v----+ +--v-----------+--+ | | | | | SwingGUIClass | | ExecClasses | | | | | +--/\-----------+ +-----------------+ | Input file
(有關概述,請參見此問題 )現在,我想擺脫靜態引用並使用依賴項注入。
public class SwingGUI extends javax.swing.JFrame {
private MainApp ma;
public SwingGUI(MainApp ma) {
this.ma = ma;
} [...]
我掙扎的一點是,GUI是作為線程啟動的,因此不能包含任何參數。
[...]
//still in SwingGUI.class
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SwingGUI().setVisible(true);
}
});
如何在不破壞代碼的情況下注入依賴關系? SO上與該主題相關的大多數問題都與Guice有關-目前我不想使用。
謝謝。
您可以將代碼更改為:
public class SwingGUI extends javax.swing.JFrame {
private AppInterface ma;
public SwingGUI() {
}
public SwingGUI setAppInterface(AppInterface ma) {
this.ma = ma;
return this;
}
[...]
然后,您可以像這樣運行它:
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SwingGUI().setAppInterface(ma).setVisible(true);
}
});
我什么都看不到為什么不能在run()方法中使用注入器(無論選擇哪種框架),例如
public void run() {
Injector.getInstance().make(SwingGUI.class).setVisible(true);
}
手動訪問進樣器在代碼中有一些入口點是正常的。 我想說,初始化GUI的方法就是這樣。
請記住,通過匿名聲明,您可以在匿名類型聲明中訪問周圍方法的參數和變量(就像我假設您的線程實例一樣):
public void startGUI(final Injector inject) {
EventQueue.invokeLater(new Runnable {
public void run() {
injector.make(SwingGUI.class).setVisible(true);
}
});
}
或使用您的線程中的相應字段制作一個顯式類:
public class GUIStarter implements Runnable {
private Injector injector;
public GUIStarter(Injector injector) {
this.injector = injector;
}
@Override
public void run() { ... }
}
然后像這樣使用
EventQueue.invokeLater(new GUIStarter(injector));
最后,您可以通過以下方式將注入事件提升到一個水平
public class GUIStarter implements Runnable {
@Inject Injector injector;
@Override
public void run() { ... }
}
和
GUIStarter s = injector.make(GUIStarter.class);
EventQueue.invokeLater(s);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.