1

オブジェクトを実装に渡し、ローカル オブジェクトを外部のオブジェクトに渡すにはどうすればよいですか? SwingUtilities.invokeLater は Swing オブジェクトに必要だと思いますよね?

  Sensors sens = new Sensors();

  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    GUI application = new GUI(sens);
    application.getJFrame().setVisible(true);
   }
  });

  SMS sms = new SMS(application);

これは私が問題を解決しようとしていますが、タイプ GUI の囲んでいるインスタンスがアクセス可能ではありません。タイプ GUI の囲みインスタンスで割り当てを修飾する必要があります (例: x は GUI のインスタンスである xnew A())。問題。

// in main
Sensors sens = new Sensors();
GUI application = null;
SwingUtilities.invokeLater(new GUIthread(sens , application));
SMS sms = new SMS(application);


//a class inside GUI.java , but not inside GUI class
class GUIthread implements Runnable{
  Sensors s;
  GUI g;
  public GUIthread(Sensors s , GUI g){
   this.s = s;
   this.g = g;
  }

  @Override
  public void run() {
   // TODO Auto-generated method stub
   g = new GUI(s);
   g.getJFrame().setVisible(true);
  }
 }

ソースコード

4

4 に答える 4

2

この問題は、外側のクラスのインスタンスを指定 (または暗黙指定) しないコンテキストで非静的内部クラスのインスタンスを作成しようとすると発生します。

このことから、クラスの 1 つを非静的内部クラスとして宣言したと推測できます。たとえば、次のようなものです。

public class Outer {
    ...
    public class Inner {
        public Inner() {
           ...
        }
        ...
    }
    ...
}

Innerを使用して他のコードでのインスタンスを作成しようとすると、表示されnew Inner()ているようなコンパイル エラーが発生します。

問題を「修正」するには、次の 2 つのいずれかを実行できます。

  • に変更すればpublic class Inner {public static class Inner {そのままご利用いただけますnew Inner()。ただし、これは、 のコードがInner外側のクラスの (最終的な) インスタンス変数にアクセスできないことを意味します。すなわちOuter

  • 静的クラスに変更したくない場合はInner、次のようにインスタンス化する必要があります。

    Outer outer = ...
    ...
    Inner inner = outer.new Inner();  // qualified creation
    

ファローアップ

静的クラスを使用してスイングを呼び出す欠点はありますか?

上記で特定したもののみ。

SO 、すべてのインスタンス化は Outer コンストラクター内で行われますか? 右?

いいえ。上記の「修飾された作成」の例のコードは、Innerクラスにアクセスできる場所ならどこにでも表示できます。そして、それを次のように宣言したのでpublic...

Innerのコンストラクター (またはインスタンス メソッド) 内でインスタンス化する場合Outerは、new Inner(). 囲んでいるOuterインスタンスは と同じthisです。

于 2011-01-20T04:41:57.303 に答える
0

簡単です。参照 final を宣言すると、anon クラス コードで表示されます。

于 2011-01-20T04:38:55.047 に答える
0

試す

final Sensors sens = new Sensors();

代わりは。

于 2011-01-20T04:17:14.260 に答える
0

私は Zach に同意し、GUIthread は内部クラスであると考えています。その場合、それをスタンドアロン クラスまたは静的内部クラスにするのがよいかもしれませんが、詳細な情報と実際のエラー メッセージがなければ、これが真の解決策かどうかを判断するのは困難です。

于 2011-01-20T04:43:31.550 に答える