プロが教えるわが家の防犯対策術!

JFrameを継承したクラスで、フィールドにJButton
myjbutton,JText myjtext,JLabel myjlabel
などを宣言しています。クラスのコンストラクタで
それらを初期化し、ついでに以下の記述を
しているのですが、this.myjtextとthis.myjlabelで
thisが解決できない、というエラーになります。
thisをはずすと、うまくいくのですが、なぜthisを
描いてはいけないのか分かりません。
教えてください。
myjbutton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
try{
Socket mys=new Socket(this.myjtext.getText(),
5555);
this.myjlabel.setText("接続しました。");
mys.close();
}catch(IOException ie){}
}});

A 回答 (3件)

class Foo {


 Object object;

 //インナークラス
 class InnerFoo {
  public void hoge(){
   object = new Object();
  }
 }
}

上記の関係と同じです。
インナークラス「InnnerFoo」からそれを内包している「Foo」クラスのメンバ「object」へのアクセスという関係です。
thisというのは当該クラスのインスタンスを指す記述子ですから、「object」は自分自身のメンバでないためにコンパイルエラーになります。
そして、「object」は自分自身を内包しているクラスのメンバであるためにとくに記述子を指定しなくてもいいわけです。
このへんは継承の場合と似ています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
インナークラスというのは、調べて分かって
きたのですが、継承に似ているということで、
非常に具体的に、理解することができました。
またお願いします。

お礼日時:2004/11/22 23:49

thisの指す先がActionListenerインターフェースを実装した匿名クラスのオブジェクトを指しているからです。



new ActionListener(){
public void actionPerformed(ActionEvent ae){
try{
Socket mys=new Socket(this.myjtext.getText(),
5555);
this.myjlabel.setText("接続しました。");
mys.close();
}catch(IOException ie){}
}
}

のところで匿名のオブジェクトが生成されています。

どうしてもthisを使いたければ
「クラス名.this.メンバ」
といった記述でいけるはずです。
    • good
    • 0
この回答へのお礼

ありがとうございます。よく考えてみます。
ただ、thisがない場合、myjtextにアクセスするのに
なんらかの、クラス名をつける必要は、ないのかな。

お礼日時:2004/11/22 00:04

すごく自身がないのですが・・・


まだ誰も回答していないようなので、取りあえず。
thisが付くとうまくいかないのは、このクラスがインスタンス化されていない状態では、this(=JFrame)にmyjtextというオブジェクトがあるか分からないからでは?と思いますが。

通常、こういう場合にthisはつけないです。

すごく説明不足ですみません。
詳しい方からのご回答お待ちしています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
詳しい方からの回答があったので、よく考えて
みます。

お礼日時:2004/11/22 00:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!