- PR -

無名インナクラスにデータを渡す方法

投稿者投稿内容
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-10-15 20:20
すいません。つかぬことを伺いますが、、、(・_・、)グスン
無名インナクラスにデータを渡したいのですがうまくいきません。
どなたかご尽力をいただけないでしょうか?
もともとこのようなことをやること自体まちがっているのでしょうか?

下記にコード添付しておきます。かなり省略ささせ頂きました、
その為ちょっと読みずらいコードとなってしまいました。
すみません。m(_ _)mペコリンコ
(もともと読みずらいと?、、、(汗)m(_ _)mm(_ _)mペコリンコ)

パネルにカレンダーを描かせていませす。
カレンダーの日付部がボタンになっております。
実装したい処理ですが、
ボタンを押した際のイベントで、ボタンオブジェクトのラベル情報を取込み
最後にTextFieldに書込みを行う。

添付の下記のコードを実行しますと、無名インナークラス内の
DateText.tf.setText(label[col][row]);
部分でコンパイルエラーが発生します。無名インナークラスでは Mypanelクラスの
ローカル変数 col,rowが使えないみたいです、、、(当たり前ですと?(汗))
そこで、無名インナクラスにデータを渡そうと、row,colともに Mypanelクラスで
静的変数として定義して、ループの変数も静的変数を使用しました。

//ボタン作成
for(row = 0; row < 6; row++) {
for(col = 0; col < 7; col++) {

結果、カレンダー上の日付ボタンを押してTextFieldへの書き出された
文字は null となってしまいました。要するに、
無名インナクラス上の
 
 DateText.tf.setText(label[row][col]);

の部分は、ループの最終値 label[5][6] ( == null なのですが)
が表示されたみたいです。わたしは、1回1回ごとのループで
ボタンにリスナーの登録が行われて、たとえば
row = 2,col =3 のときであれば

DateText.tf.setText(label[2][3]);

が登録されていて、後ほどボタンを押したときの処理では
label[2][3]の値が取得できると思っていたのですが、
取得できたのは 配列の最終値 label[5][6]となり、
どうも私の思惑とはちがった結果となってしまいました。

ちょと私の説明が至らぬこともあり、また、長々とした文書になってしまいましたが、
質問の趣旨ご理解頂けたでしょか? どなたか、無名インナクラスにデータを
引き渡す方法をご存知でしたらご教授おねがいします。m(_ _)mペコリンコ
 コンストラクタなんかつくれれば、簡単に渡されるだけどな、、、、
(・_・。 )トオイメ


--------- 現在までに作成したコードは下記の通りです ---------

class Mypanel extends Panel {

static String label[][] = new String[6][7];

-----------  中略 ----------

//カレンダー表示部の作成
public void paint(Graphics g) {

//ローカル変数にてボタンオブジェクト作成作成
Button button[][] = new Button[6][7];
for(int row = 0; row < 6; row++) {
for(int col = 0; col < 7; col++) {
button[row][col] = new Button();
}
}

//ボタン作成
for(int row = 0; row < 6; row++) {
for(int col = 0; col < 7; col++) {

-----------  中略 ----------

//ボタンの大きさを決める
button[row][col].setBounds(new Rectangle(left+5,high+5,c-10,2*r-10));
//ボタンのラベルを書く
button[row][col].setLabel(new Integer(dom).toString());
静的変数に格納した配列にボタンオブジェクトのラベル名を取込
label[row][col] = button[row][col].getLabel();

     //ボタンにイベント発生時の動作を実装させる。
button[row][col].addActionListener( new ActionListener() {

public void actionPerformed(ActionEvent ae){

//カレンダーを表示しているフレームをクローズする
CalendarApplet.f2.closeFrame();
//TextFieldにボタンオブジェクトより取得した情報を表示する
DateText.tf.setText(label[row][col]);
}
});
add(button[row][col],null);
}
} ++dom;
}
}







ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-10-15 21:37
有名インナークラスを作って、コンストラクタで「row」と「col」を渡せば良いのでは?
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-10-15 21:44
こんばんは、Wataです。
引用:

忍者鳥取県さんの書き込み (2003-10-15 20:20) より:
添付の下記のコードを実行しますと、無名インナークラス内の
DateText.tf.setText(label[col][row]);
部分でコンパイルエラーが発生します。



次のようなコンパイルエラーが出力されていると思います。
『ローカル変数 row は内部クラスからアクセスされます。final で宣言される必要があります。』
ですので、メッセージ通りに対処をしてください。
コード:

final int finalRow = row;
final int finalCol = col;
:
new ActionListener() {
public void actionPerformed(ActionEvent ae){
CalendarApplet.f2.closeFrame();
DateText.tf.setText(label[finalRow][finalCol]);
}
}


もしくは
コード:

final String finalLabel = label[finalRow][finalCol];
:
new ActionListener() {
public void actionPerformed(ActionEvent ae){
CalendarApplet.f2.closeFrame();
DateText.tf.setText(finalLabel);
}
}



[ メッセージ編集済み 編集者: Wata 編集日時 2003-10-15 21:46 ]
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-10-16 09:26
引用:

ぽんさんの書き込み (2003-10-15 21:37) より:
有名インナークラスを作って、コンストラクタで「row」と「col」を渡せば良いのでは?




こんな長い質問にご回答いただきまことにありがとうございます。
(・_・、)(感涙)
有名インナクラスでボタンを押したというイベントを拾うには
どのようなアダプタを使えばいいのでしょうか?
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-10-16 09:36
引用:

Wataさんの書き込み (2003-10-15 21:44) より:
こんばんは、Wataです。

次のようなコンパイルエラーが出力されていると思います。
『ローカル変数 row は内部クラスからアクセスされます。final で宣言される必要があります。』
ですので、メッセージ通りに対処をしてください。

コード:
final int finalRow = row;
final int finalCol = col;
 :
new ActionListener() { 
  public void actionPerformed(ActionEvent ae){ 
    CalendarApplet.f2.closeFrame(); 
    DateText.tf.setText(label[finalRow][finalCol]); 
  } 
} 


もしくは
コード:
final String finalLabel = label[finalRow][finalCol];
 :
new ActionListener() { 
  public void actionPerformed(ActionEvent ae){ 
    CalendarApplet.f2.closeFrame(); 
    DateText.tf.setText(finalLabel); 
  } 
} 





WATAさん、スペシャルサンクスです(・_・。)(感涙)
WATAさんのコードでうまく動作させることができました。
ちゃんとコンパイルエラーの内容を解析しないとだめですね、、、
基本中の基本ですね・・・(汗)

ちなみに、わたしの開発環境はEclipse2.0で日本語訳のプラグインを使って
いるのですが、コンパイルエラーの内容が

異なるメソッドで定義された内部クラス内で non-final変数 rowを参照できません。

と言うものでした。それで意味がわからず立ち往生してしまいました、、
やっぱり日本語訳に頼りすぎるのも考えものですね、、(反省)

WATAさんどうもありがとうございました。(。・_・)(感涙)

ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-10-16 09:42
引用:

忍者鳥取県さんの書き込み (2003-10-16 09:26) より:

有名インナクラスでボタンを押したというイベントを拾うには
どのようなアダプタを使えばいいのでしょうか?


質問の意味を勘違いしてるかもしれませんが・・・
有名も無名と一緒ですよ、ActionListenerを実装するだけです。

アダプタを使いたいので有れば、AbstractActionかな?
(使ったこと無いですが...)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-10-16 10:03
unibon です。こんにちわ。

引用:

Wataさんの書き込み (2003-10-15 21:44) より:
次のようなコンパイルエラーが出力されていると思います。
『ローカル変数 row は内部クラスからアクセスされます。final で宣言される必要があります。』
ですので、メッセージ通りに対処をしてください。


私は、今までとりあえずコンパイルエラーを解消するために final を付けてきました。
(ちなみに、オブジェクト型変数ならば単に変数に final を付けるだけでよいですが、
基本型変数だと、final 用の変数を別に設ける必要がある場合もあるので面倒です。)

が、なんで final を付けなければならないのかの必然性が良く分かりません。
final がなくても、静的なコンテキスト(static/lexical な context)から分かりそうな気もします。
もしかしたら、Java のコンパイラ(javac 等)が楽をしたいためだけのために、
そのような仕様になっているような気がするのですが、
この予想は正しいでしょうか。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-10-16 10:10
unibon です。こんにちわ。

引用:

忍者鳥取県さんの書き込み (2003-10-16 09:36) より:
ちなみに、わたしの開発環境はEclipse2.0で日本語訳のプラグインを使って
いるのですが、コンパイルエラーの内容が

異なるメソッドで定義された内部クラス内で non-final変数 rowを参照できません。

と言うものでした。それで意味がわからず立ち往生してしまいました、、
やっぱり日本語訳に頼りすぎるのも考えものですね、、(反省)


私は、概して Eclipse のエラーメッセージのほうが、
JDK(J2SDK) の javac が出すエラーメッセージよりも的確だと思っています。
#英語→日本語の訳は別にして。

が、今回の final のケースだとどっちも分かりにくいですね。
しかし、Eclipse のほうは「異なるメソッド」という情報があり、
JDK にはこれに相当する情報がないので、
やはり Eclipse のほうが優れているように思いましたがどうでしょうか。
#両方見比べるのが一番良い?

スキルアップ/キャリアアップ(JOB@IT)