JAVA初心者です。
ある、画面にボタン50個を作成しました。(JButtonの配列で作成しました。)
そこで質問です。下記のコールバックメソッド(?)btnActionPerformedを50個分作成するのは
煩雑なので1つで処理しようと考えております。
for (int cnt=0; cnt<50; cnt++) {
...
JButtonのインスタンス生成処理等
...
btn[cnt-1].addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnActionPerformed(evt);
}
});
}
...
...
...
private void btnActionPerformed(java.awt.event.ActionEvent evt) {
...
}
btnActionPerformedで受け取ったevtパラメータから押されたボタンのプロパティ等
が判別つくのでしょうか?ActionEventクラスのヘルプを参照しましたが、
いまひとつ良くわかりません。
また、このevtパラメータを使う方法以外で、この様な事が実現できる方法が
あれば教えてください。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
やり方は二つあります。
ご指摘の通り、evtパラメータから情報を得ます。
それで、その情報を得るときに、
「getSource()で、イベントを発生したオブジェクト参照を得る」のと、
「getActionCommand()で『アクションコマンド』を得る」方法があります。
前者から説明すると、、
getSource()メソッドで
イベントを発生したオブジェクトを得ることができます。
だから、
Object source = evt.getSource();
として、
if(source == btn[i]).....;
というふうに判別します。
この方法の欠点として、「判別する側で、ボタンオブジェクトの参照を全部持ってなければならない」
という事があります。
もう一つのアクションコマンドを使う方法は、
ボタンに「アクションコマンド」というStringをセットしておいて、
evtからgetActionCommand()で取り出し、判別します。
btn[i].setActionCommand("" + i);
....
String command = evt.getActionCommand();
if(command.equals("" + j))...;
のようにします。
この方法の欠点として、事前にアクションコマンドを登録しておく必要があります。
もっとも、ボタンにテキストを表示している場合、
デフォルトではそのテキストがアクションコマンドとなります。
ボタンにテキストがあり、それぞれ違っていたらそれを使用できます。
利点としては、ボタンの参照を知らなくても処理できること、
複数のボタンから同じアクションを受け取るのが簡単なことが挙げられます。
No.4
- 回答日時:
ActionListenerを無名クラスではなく、インナークラスとして定義しておいて、1ボタンにつき1インスタンスを使うようにするのはどうでしょう?
--
例えば、クラス内で↓のように定義する。
private class ButtonListener implements ActionListener {
int number;
ButtonListener(int number) {
this.number = number;
}
public void actionPerformed(ActionEvent evt) {
//numberを利用する、あるいはnumberに応じた処理
}
}
--
で、使うところでは、↓こんな感じとか。
for (int i=0; i<10; i++) {
buttons[i] = new JButton(Integer.toString(i));
buttons[i].addActionListener(new ButtonListener(i));
getContentPane().add(buttons[i]);
}
--
うまくすれば、押されたボタンの数だけevent.getSource()のif文を作る必要はなくなるのでは。
ご参考になれば。。
No.3
- 回答日時:
#2ですが、なぜbtnActionPerformedを定義しているのか、分からないのですが。
ボタン毎にメソッドを用意するという事なら、↓のようになります。
public void actionPerformed(ActionEvent event) {
if(e.getSource() == btnA) {
btnAactionPerformed(event);
}
else if(e.getSource() == btnB) {
btnBactionPerformed(event);
}
else if(e.getSource() == btnEnd) {
System.exit(0);
}
}
public void btnAactionPerformed(ActionEvent e) {
// ここにボタンAの処理を書く
}
public void btnBactionPerformed(ActionEvent e) {
// ここにボタンBの処理をかく
}
普通は#2の様に簡単にすると思うんですが。
確かに良く見ると、btnActionPerformedの定義をわざわざしている理由がよくわかりませんね。マニュアルを見ると
ハンを押したように定義しているサンプルが多いので、そのままプログラミングしていました。ありがとうございました。
No.2
- 回答日時:
こんばんは。
普通は↓のようにします。public void actionPerformed(ActionEvent e) {
if(e.getSource() == btn1) {
// ボタン1の処理
}
else if( e.getSource() == btn2) {
// ボタン2の処理
}
else if(e.getSource() == btn3) {
// ボタン3の処理
}
else if( e.getSource() == btnEnd) {
System.exit(0);
}
}
btnEndというのは、終了ボタンです。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
VB.NETでMSComm が追加できず?
-
requestFocusについて
-
C++Builderの警告
-
Visual Basic 2010を使ってRS-2...
-
AWTとSwingについて
-
コントロールの表示・非表示
-
パネルをスクロールするには?
-
クラスのインスタンスからクラ...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
インスタンス参照でアクセスで...
-
変数名の付け方
-
配列の重複する値とその個数を...
-
配列のメソッド
-
VB.NET getとsetの概念がわかり...
-
C#でフォームのオブジェクト名...
-
java eclipse 型に解決できません
-
Java初級 引数に適用できません
-
レコード件数の表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
VB.NETでMSComm が追加できず?
-
requestFocusについて
-
Visual Basic 2010を使ってRS-2...
-
JScrollPane上のJTableの再描画
-
ファイル保存先のダイアログが...
-
delphi stringgrid
-
JButton配列でのイベント処理
-
VB6のツールボックスへのコンポ...
-
VBでCPUの使用率を取得できます...
-
アクティブなTextFiel...
-
[delphi] 変数を利用してコンポ...
-
ツールボックスのような折りたたみ
-
JOptionPaneのダイアログパネル...
-
C#で設定時刻到来時にイベント...
-
子パネルから親パネルのコント...
-
Buttonの色
-
コントロールの表示・非表示
-
GUI画面でsetBounds()で作成し...
-
java 電卓 平方根
おすすめ情報