3

このウェブサイトをよく利用しますが、投稿は初めてです。私のプログラムは、ファイル内のレコード数に応じて多数のボタンを作成します。例: 5 つのレコード、5 つのボタン。

ボタンは作成されていますが、アクション リスナーに問題があります。

ループにアクション リスナーを追加すると、すべてのボタンが同じことを行います。しかし、ループの外側にアクションリスナーを追加すると、アクションリスナーが最後のボタンに追加されるだけです。

何か案は?

これが私がコード的に持っているものです(スペースを節約するために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++;
}

とても有難い

4

5 に答える 5

3

作成しているボタンごとに 1 つのアクション リスナーを作成しているので、次のようにすることができます。

final int buttonIndex = i;
b.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent ae2) {
       System.out.println("Button pressed is: " + buttonIndex);
   }
}

匿名クラス メソッド内の変数にアクセスするには、final とマークする必要があります。それがあなたがそのfinal int buttonIndex = i;声明を持っているものです。

ボタンのメソッドを使用して、クラスのactionCommandプロパティsetActionCommandから取得できるアクション コマンドをボタンに定義できます。そうすることで、すべてのボタンに対して同じリスナーを持つことができます。そのアクション コマンドを、例で定義した変数に設定できます。そうすることで、アプリケーションで作成する匿名クラスが少なくなり、これは常に良いことです (より少ないオブジェクトがより少ないメモリを消費します)。ActionEventbuttonIndex

于 2010-03-12T02:05:59.910 に答える
2

各ボタンのボタン参照とインデックス ( i) を、作成時にハッシュ マップに追加できます。

ワン アクション リスナーでは、ボタン参照によって、ハッシュマップ内のイベントのソースとなったボタンのインデックスを検索できます。

このようなもの(疑似コードなので、コンパイルされない場合でもplsは私に反対票を投じません):

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 its index
            Integer index = map.get( ae2.getSource() );

            // Do something different here based upon index
        }
    });
    j++;
}
于 2010-03-12T02:04:51.613 に答える
1

ループの外側で ActionListeners をセットアップし、それらの配列を作成しないでください。リスナー配列内の 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]);
}

警告ですが、私はこのコードをテストしていません。

于 2010-03-12T02:01:49.397 に答える
0
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();
                }
                });
               }
            }
}
于 2012-09-03T15:58:08.520 に答える
0

最初の問題は、 variable への依存にありますj

すべてのボタンにまったく同じ ActionListener を割り当てています。これにより、 indexjにオブジェクトが出力されます。これは、ボタンが表示された時点で == 増分時のリストの最後のインデックスである ListnamesAです。

于 2010-03-12T02:12:17.727 に答える