- PR -

コンストラクタで定義しているオブジェクトをメソッドで使用するには

投稿者投稿内容
be1300cc
ベテラン
会議室デビュー日: 2002/07/04
投稿数: 88
投稿日時: 2003-05-20 18:22
be1300ccと申します。
現在Javaアプリションを構築しながら学習中なのですが、1点ご質問させて頂きます。
画面のパネルクラスAを作成しているのですが、構造が以下のようになっています。

パネルAクラス{
 ・パネルAのコンストラクタ
 ・メソッド
}

このようになっていまして、このメソッドからパネルAのコンストラクタで定義した
オブジェクト(jbutton1)を使用したいのですが、通常の使用方法ではスコープから外れてしまい
使用することが出来ません。
どのように定義すれば、メソッド内から使用することが出来るのでしょうか?

〜メソッド呼び出す処理とエラー内容〜
public void actionPerformed(ActionEvent ae){
if(ae.getSource() == jButton1){
find();
}
}

PanelA.java:205: シンボルを解決できません。
シンボル: 変数 jButton1
場所 : PanelA の クラス
if(ae.getSource() == jButton1){

初歩的なご質問で申し訳ありませんが、ご享受お願いします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-05-20 18:38
>このようになっていまして、このメソッドからパネルAのコンストラクタで定義した
オブジェクト(jbutton1)を使用したいのですが、通常の使用方法ではスコープから外れてしまい
使用することが出来ません。
どのように定義すれば、メソッド内から使用することが出来るのでしょうか?

コンストラクタのコードが書かれていないので推測ですが、jButton1がローカル変数に
なっていると思います。これをプライベートなフィールド変数にすればよいと思います。
be1300cc
ベテラン
会議室デビュー日: 2002/07/04
投稿数: 88
投稿日時: 2003-05-20 18:54
UKさんご返答ありがとうございます。
コンストラクタの抜粋は以下のような感じです。
public PanelA(){
super(new FlowLayout());
JPanel jPanelA = new JPanel(null);
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();

JButton jButton2 = new JButton();

jButton2.setText("検索");
jButton2.setBounds(new Rectangle(425, 357, 85, 26));
}

確かに外に出して、宣言してあげればよいのですが、TABを使用した画面ですので、
構造上無理な感じです。
(もしかしたら出来るのかもしれませんが、間違っていたらすみません)
TABを使用した構造でもそのような方法で定義するやり方はありますでしょうか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-05-20 19:13

be1300ccさんの書き込み (2003-05-20 18:54) より:
>確かに外に出して、宣言してあげればよいのですが、TABを使用した画面ですので、
構造上無理な感じです。

申し訳ありませんが、なぜ無理なのかわかりません。

>コンストラクタの抜粋は以下のような感じです。

jButton1がどこにも宣言されていませんが、JButton2の間違いだとして…

private JButton jButton2;
public PanelA(){
super(new FlowLayout());
JPanel jPanelA = new JPanel(null);
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();

jButton2 = new JButton();

jButton2.setText("検索");
jButton2.setBounds(new Rectangle(425, 357, 85, 26));
}

このようにするのはなにか問題があるんですか?
be1300cc
ベテラン
会議室デビュー日: 2002/07/04
投稿数: 88
投稿日時: 2003-05-20 19:21
jButton1とjButton2の記載ミスでした。

私も初めてですので、完全に無理とは言えませんが、もし他のやりかたがありましたら
教えて頂きたいです。

やはりこの構造ですと、UKさんが教えて下さったやり方は出来ませんでしょうか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-05-20 20:54
>やはりこの構造ですと、UKさんが教えて下さったやり方は出来ませんでしょうか?

私はJavaでGUIアプリケーションを書いたことがないのでなにが正しいのかわかりませんが、
そもそも生成したオブジェクトがコンストラクタのローカル変数では、パネルに表示もされ
ないと思うんですが。
#だってコンストラクタを出たらオブジェクトの参照切れちゃうでしょ

何を参考にしてプログラムを書かれているのかわかりませんが、JButtonなどのオブジェクト
の変数はprivateかprotectedにしていませんか?
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-05-21 09:56
引用:

ukさんの書き込み (2003-05-20 20:54) より:
>やはりこの構造ですと、UKさんが教えて下さったやり方は出来ませんでしょうか?

私はJavaでGUIアプリケーションを書いたことがないのでなにが正しいのかわかりませんが、
そもそも生成したオブジェクトがコンストラクタのローカル変数では、パネルに表示もされ
ないと思うんですが。
#だってコンストラクタを出たらオブジェクトの参照切れちゃうでしょ

何を参考にしてプログラムを書かれているのかわかりませんが、JButtonなどのオブジェクト
の変数はprivateかprotectedにしていませんか?



下記のような例は表示されないとおっしゃっていますか?
この例はちゃんと表示されます。

//サンプル
import java.awt.*;
import javax.swing.*;

public class SampleApp extends JFrame{

SampleApp(){
JLabel label = new JLabel("てすと");
Container contentPane = getContentPane();

contentPane.add(label);
}

public static void main(String[] args){
SampleApp app = new SampleApp();
app.setBounds(100,100,100,100);
app.setVisible(true);
}

}
be1300cc
ベテラン
会議室デビュー日: 2002/07/04
投稿数: 88
投稿日時: 2003-05-21 10:05
ご返信が遅れてしまいすみません。
UKさんtakuさんありがとうございます。

結局、構造上の問題でした。
コンストラクタにてオブジェクトを定義していたので、スコープが外れてしまっており、
この構造はやってはいけない構造のようでした。

ですので、クラスとコンストラクタの間(コンストラクタ外)で定義したら上手く行きました。
初歩的な質問で、大変お騒がせしました。
ありがとうございました。

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