
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
ダイアログでタイトルバーを非表示
-
[delphi] 変数を利用してコンポ...
-
ファイル保存先のダイアログが...
-
requestFocusについて
-
変数名の付け方
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
レコード件数の表示
-
「インスタンス」の意味をわか...
-
サーブレットコンテキストの意...
-
インスタンス参照でアクセスで...
-
final修飾子を使っているのに、...
-
クラス間でのデータ参照
-
private static という変数の修飾
-
オブジェクトレベルとメタレベル
-
java 次の機能を有するメソッド...
-
エクセルVBA 画像を貼り付ける...
-
C#において、同じインスタンス...
-
VBA コピーが出来ません…!
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
VB.NETでMSComm が追加できず?
-
Visual Basic 2010を使ってRS-2...
-
ファイル保存先のダイアログが...
-
フレーム上のコンポーネントの...
-
requestFocusについて
-
イベントとスレッド
-
Delphiでビデオキャプチャー画...
-
GmailをSWTフレームに表示し、...
-
imageにリスナーを付けたい
-
「ScrollPane」のイベントの取...
-
文字の色の変更
-
VS2010デザイナーの読込エラー...
-
クリックしても反応してくれま...
-
VB6のツールボックスへのコンポ...
-
JButton配列でのイベント処理
-
Buttonの色
-
重なっているコンポの実行時優...
-
Googleツールバーライクなコン...
-
tableView reloadDataが出来ない
おすすめ情報