2011-01-20 16 views
1

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

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のインスタンスです)。問題です。

// 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); 
    } 
} 

sourcecode

+1

は 'GUIthread'ローカルローカルクラスですか、それとも別ですか? –

+0

編集中、混乱して申し訳ありません! – wizztjh

答えて

2

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

これから、クラスの1つを非静的な内部クラスとして宣言したことを推論します。例えばこのような何か:

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

あなたが今new Inner()を使用して、いくつかの他のコードにInnerのインスタンスを作成しようとすると、あなたが見ているようなコンパイルエラーが発生します。

あなたは、問題を「解決」するための2つのいずれかの操作を行うことができます

  • あなたはpublic static class Inner {public class Inner {を変更する場合は、現在行っているとして、あなたはnew Inner()を使用することができます。しかし、これはInnerというコードが、囲むクラスの(最終的な)インスタンス変数にアクセスできないことを意味します。すなわちOuterである。

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

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

フォロー

任意の下側静的なクラスを使用してスイングを呼び出しますか?

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

だから、すべてのインスタンス化は外側のコンストラクタ内で行われますか?右?

号「資格の作成」の例のコードは、上記Innerクラスがアクセス可能であることをどこにでも現れることができます。そして、我々はpublicと宣言して以来、...

Outerのコンストラクタ(またはインスタンスメソッド)内でInnerをインスタンス化する場合は、new Inner()を使用できます。同封のOuterインスタンスはthisと同じです。

+0

静的クラスを使用してスイングを呼び出す側がありますか?だから、すべてのインスタンスは外側のコンストラクタの内部で発生する?右? – wizztjh

0

代わり

final Sensors sens = new Sensors(); 

を試してみてください。

+0

しかし、最終的な手段は変更できません。私は、センサーオブジェクト内の値を変更するスレッドを実行しています。 – wizztjh

+0

@wizztjh - @Alice Youngの解答を参照してください。これはあなたの直ちに問題ではありません。 –

+0

あなたは私にリンクを渡すことができます、それはSOのプロファイルで尋ねる人の名前を表示しません... – wizztjh

0

簡単に、リファレンスを最終的に宣言してください。これは、アノテーションクラスコードで参照されます。

+0

これは問題ではありません。そうであれば、OPは囲むクラスで非最終参照の使用について不平を言う別の点でコンパイルエラーを見るでしょう。 –

0

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

関連する問題