- - PR -
無名インナクラスにデータを渡す方法
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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-10-15 21:37
有名インナークラスを作って、コンストラクタで「row」と「col」を渡せば良いのでは?
| ||||||||||||
|
投稿日時: 2003-10-15 21:44
こんばんは、Wataです。
次のようなコンパイルエラーが出力されていると思います。 『ローカル変数 row は内部クラスからアクセスされます。final で宣言される必要があります。』 ですので、メッセージ通りに対処をしてください。
もしくは
[ メッセージ編集済み 編集者: Wata 編集日時 2003-10-15 21:46 ] | ||||||||||||
|
投稿日時: 2003-10-16 09:26
こんな長い質問にご回答いただきまことにありがとうございます。 (・_・、)(感涙) 有名インナクラスでボタンを押したというイベントを拾うには どのようなアダプタを使えばいいのでしょうか? | ||||||||||||
|
投稿日時: 2003-10-16 09:36
WATAさん、スペシャルサンクスです(・_・。)(感涙) WATAさんのコードでうまく動作させることができました。 ちゃんとコンパイルエラーの内容を解析しないとだめですね、、、 基本中の基本ですね・・・(汗) ちなみに、わたしの開発環境はEclipse2.0で日本語訳のプラグインを使って いるのですが、コンパイルエラーの内容が 異なるメソッドで定義された内部クラス内で non-final変数 rowを参照できません。 と言うものでした。それで意味がわからず立ち往生してしまいました、、 やっぱり日本語訳に頼りすぎるのも考えものですね、、(反省) WATAさんどうもありがとうございました。(。・_・)(感涙) | ||||||||||||
|
投稿日時: 2003-10-16 09:42
質問の意味を勘違いしてるかもしれませんが・・・ 有名も無名と一緒ですよ、ActionListenerを実装するだけです。 アダプタを使いたいので有れば、AbstractActionかな? (使ったこと無いですが...) | ||||||||||||
|
投稿日時: 2003-10-16 10:03
unibon です。こんにちわ。
私は、今までとりあえずコンパイルエラーを解消するために final を付けてきました。 (ちなみに、オブジェクト型変数ならば単に変数に final を付けるだけでよいですが、 基本型変数だと、final 用の変数を別に設ける必要がある場合もあるので面倒です。) が、なんで final を付けなければならないのかの必然性が良く分かりません。 final がなくても、静的なコンテキスト(static/lexical な context)から分かりそうな気もします。 もしかしたら、Java のコンパイラ(javac 等)が楽をしたいためだけのために、 そのような仕様になっているような気がするのですが、 この予想は正しいでしょうか。 | ||||||||||||
|
投稿日時: 2003-10-16 10:10
unibon です。こんにちわ。
私は、概して Eclipse のエラーメッセージのほうが、 JDK(J2SDK) の javac が出すエラーメッセージよりも的確だと思っています。 #英語→日本語の訳は別にして。 が、今回の final のケースだとどっちも分かりにくいですね。 しかし、Eclipse のほうは「異なるメソッド」という情報があり、 JDK にはこれに相当する情報がないので、 やはり Eclipse のほうが優れているように思いましたがどうでしょうか。 #両方見比べるのが一番良い? | ||||||||||||
