簡體   English   中英

Java Swing依賴注入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM