0

Netbeans を使用して構築した Swing GUI がありますが、これまでは静的参照を使用して他のクラスと通信していました。

                 +---------------------+
                 | | MainClass (静的) |
                 |----------------------|
          +-----+ -DataList +-----+
          | | | | | | | |
    静的| +-+--------------+-----+ |静的
  参照 | | | |参照
          | | |新しい () | 新しい () |
          | | | | | | | |
          | | | | | | | |
        +-+--------v----+ +--v----------+--+
        | | | | | | | |
        | | SwingGUI クラス | | | 実行クラス |
        | | | | | | | |
        +--/\-----------+ +-----------------+
           | |
          入力ファイル

(概要については、この質問を参照してください) 静的参照を取り除き、依存性注入を使用したいと考えています。

public class SwingGUI extends javax.swing.JFrame {
    private MainApp ma;

    public SwingGUI(MainApp ma) {
           this.ma = ma;

    } [...]

私が苦労している点の 1 つは、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に関するものです.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 に答える