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で質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- Java Javaプログラミングの質問になります。 ボタンを押下した時に画面遷移して 画面から戻ってきた時のi 1 2023/06/26 07:50
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
java gui のイベント処理が重い
-
VB6のツールボックスへのコンポ...
-
画像を一瞬だけ表示する。
-
Delphiでの画像の表示について...
-
ファイル保存先のダイアログが...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
EXCEL VBAにて動的にCheckBOXを...
-
インスタンス参照でアクセスで...
-
新規契約でUQモバイル申し込も...
-
変数名の付け方
-
javascriptからjavaを呼び出したい
-
C言語での文字列より値を抜き出す
-
VB.netでメソッドからコントロ...
-
C#において、同じインスタンス...
-
Java初級 引数に適用できません
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
JSPで<SELECT>の中にDBから持っ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
ファイル保存先のダイアログが...
-
VB.NETでMSComm が追加できず?
-
Visual Basic 2010を使ってRS-2...
-
requestFocusについて
-
C#で設定時刻到来時にイベント...
-
ツールボックスのような折りたたみ
-
JScrollPane上のJTableの再描画
-
tableView reloadDataが出来ない
-
アクティブなTextFiel...
-
VBでCPUの使用率を取得できます...
-
VB6のツールボックスへのコンポ...
-
[delphi] 変数を利用してコンポ...
-
コンポーネント
-
Buttonの色
-
JButton配列でのイベント処理
-
TableModelListener 通知出し方
-
VBSでCDトレイのオープン/ク...
-
JOptionPaneのダイアログパネル...
-
VisualBasicのコンポーネントで...
おすすめ情報