Наличие разных действий для каждой кнопки, динамически создаваемой в цикле - PullRequest
3 голосов
/ 12 марта 2010

пользуюсь этим сайтом много, но впервые публикую. Моя программа создает количество кнопок в зависимости от количества записей в файле. Например. 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++;
}

высоко ценится

Ответы [ 5 ]

3 голосов
/ 12 марта 2010

Поскольку вы создаете по одному слушателю действий для каждой создаваемой кнопки, вы можете получить следующее:

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, которую я определил в вашем примере. Делая это, вы создаете меньше анонимного класса в своем приложении, что всегда хорошо (меньше объектов потребляет меньше памяти).

2 голосов
/ 12 марта 2010

Вы можете добавить ссылку на кнопку и индекс (i) каждой кнопки в хэш-карту при их создании.

В своем прослушивателе с одним действием вы можете искать индексКнопка, использовавшая событие в вашем хэш-файле по его ссылке.

Что-то вроде этого (псевдокод, поэтому, пожалуйста, не понижайте голосование, если оно не компилируется):

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++;
}
1 голос
/ 12 марта 2010

Почему бы не установить свои 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]);
}

Предупреждение, я не проверял этот код.

0 голосов
/ 03 сентября 2012
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();
                }
                });
               }
            }
}
0 голосов
/ 12 марта 2010

Ваша первая проблема связана с зависимостью от переменной j.

Вы назначаете всем кнопкам один и тот же ActionListener, который будет распечатывать объект с индексом j, который на момент отображения кнопок равен == последний индекс списка на момент приращения, из списка namesA.

...