異なるそれぞれにアクションボタンを動的に作成されたループ
-
19-09-2019 - |
質問
本サイトをご利用くが初めて。私のプログラムを作成し多数のボタンの数によってデータファイルです。E.g.5件のデータに、5つのボタンを押します。
ボタンが行われているがんの問題はアクションリスナーを追加.
場合の追加のアクションリスナーを追加、ループの各ボタンを押しても同じこと;だかのアクションリスナー以外のループで追加しますアクションリスナーへの最後のボタンを押します。
そのアイデア?
ここでは私がコード-wiseうに追加のforループの省スペース):
int j=0;
for(int i=0; i<namesA.size(); i++)
{
b = new JButton(""+namesA.get(i)+"");
conPanel.add(b);
conFrame.add(conPanel);
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae2){
System.out.println(namesA.get(j));
}
}});
j++;
}
よろしくお願いいたします
解決
として作成するたアクションリスナーの各ボタンを作成する場す:
final int buttonIndex = i;
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae2) {
System.out.println("Button pressed is: " + buttonIndex);
}
}
アクセス可変の中匿名クラスメソッドで目印になる最終的なものとする。おすすめしていること final int buttonIndex = i;
ます。
で利用できます setActionCommand
方法は、ボタンを定義するアクションコマンドにすることができることから取得する actionCommand 物件の ActionEvent
クラスです。あるいは、同じリスナーすべてのボタンを押します。できるアクションコマンドの buttonIndex
変数まで定義された例です。によって、作成する少な匿名クラスのお申し込みは、いつも以下のオブジェを消費の少いたしました。
他のヒント
あなたがそれらを作成しているとして、あなたはハッシュマップに各ボタンのボタンの参照とインデックス(i
)を追加することができます。
あなたのワンアクションリスナーでは、あなたがそのボタンを参照して、ハッシュマップでイベントを調達ボタンのインデックスを調べることができます。
このような何か(擬似コード、それがコンパイルされない場合ので、plsは私をdownvoteしないでください):
Hashmap<JButton, Integer> map = new Hashmap<JButton, Integer>();
int j=0;
for (int i = 0; i < namesA.size(); i++)
{
b = new JButton("" + namesA.get(i) + "");
conPanel.add(b);
conFrame.add(conPanel);
// Add a mapping
map.add(b, new Integer(i));
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae2) {
// Look up the button in the map, and get it's index
Integer index = map.get( ae2.getSource() );
// Do something different here based upon index
}
});
j++;
}
なぜセットアップは、あなたとあなたのActionListenerにリスナーの配列に、ActionListenerのインデックスは、それがに追加されたボタンに対応し、それらの配列を、作ります。このような何かます:
ActionAdapter[] listeners = new ActionAdapter[namesA.size()];
//fill listeners with ActionAdapters
listeners[0] = new ActionAdapter()
{
public void actionPerformed(ActionEvent e) {
//Do stuff
}
};
//Repeat for each button you need
for(int i = 0; i < namesA.size(); i++)
{
b = new JButton("" + namesA.get(i) + "");
conPanel.add(b);
b.addActionListener(listeners[i]);
}
警告しかし、私はこのコードをテストしていません。
あなたの最初の問題は、変数j
への依存度を常駐します。
あなたは増加の時に==リストの最後のインデックスを一度にボタンが表示され、インデックスj
、でオブジェクトを印刷しますボタンまったく同じのActionListenerのすべてをさ代入しています、リストnamesA
のます。
public class Scroll_view extends Activity {
Button btn;
Button btn1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scroll_view);
LinearLayout linear=(LinearLayout)findViewById(R.id.linear);
for(int i=1; i<=20 ;i++){
LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
btn=new Button(this);
btn.setId(i);
final int id_=btn.getId();
btn.setText("button " + id_);
linear.addView(btn,params);
btn1=((Button)findViewById(id_));
btn1.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
Toast.makeText(view.getContext() , "Button clicked index = " + id_ , Toast.LENGTH_SHORT).show();
}
});
}
}
}