0

我有一个 Swing GUI,我使用 Netbeans 构建它,到目前为止,它使用静态引用与其他类进行通信。

                 +------------------------+
                 | MainClass (静态) |
                 |-------------------------|
          +------+ -数据列表 +-----+
          | | | |
    静态| +-+--------------+-----+ |静态
  参考 | | |参考
          | |新 () | 新 () |
          | | | |
          | | | |
        +-+--------v----+ +--v------------+--+
        | | | |
        | SwingGUI类 | | 执行类 |
        | | | |
        +---/\-----------+ +-----------------+
           |
          输入文件

(有关概述,请参阅此问题)我现在想摆脱静态引用并使用依赖注入。

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有关-在这一点上我不想使用它。

谢谢。

4

2 回答 2

1

您可以将代码更改为:

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);
    }
});
于 2013-09-30T11:29:43.690 回答
0

我看不出为什么你不能在 run() 方法中使用你的注入器(无论你选择什么框架),比如

public void run() {
  Injector.getInstance().make(SwingGUI.class).setVisible(true);
}

如果您手动访问注入器,您的代码中有一些入口点是正常的。我会说初始化GUI的方法就是这样一个点。

请记住,您可以通过将它们声明为 final 来访问匿名类型声明中的周围方法的参数和变量(就像我假设您的线程实例一样):

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);
于 2013-09-30T11:25:35.107 回答