Pregunta

utilizar este sitio web mucho, pero primer destino vez. Mi programa crea una serie de botones en función del número de registros en un archivo. P.ej. 5 registros de 5 botones.

Los botones se crean pero estoy teniendo un problema con el oyente acción.

Si el oyente añadir la acción en el circuito de cada botón hace lo mismo; pero si añado el oyente acción fuera del bucle que sólo añade al oyente a la acción último botón.

¿Alguna idea?

Esto es lo que tengo en cuanto a código (Acabo de añadir el bucle for para ahorrar espacio):

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++;
}

muy apreciado

¿Fue útil?

Solución

Mientras esté creando un oyente de acción para cada botón que está creando, usted podría tener este aspecto:

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

Para acceder a una variable dentro de un método de clase anónima, tiene que ser marcado final. Eso es lo que tienes que final int buttonIndex = i; comunicado.

Puede utilizar el método setActionCommand en el botón para definir un comando de acción a lo que se podía recuperar de la actionCommand propiedad de la clase ActionEvent. Al hacer esto, usted podría tener el mismo procesador de todos los botones. También podemos establecer que el comando de acción a la variable buttonIndex que he definido en su ejemplo. Al hacer esto, se crea la clase menos anónimo en su aplicación, lo que siempre es bueno (menos objetos que consumen menos memoria).

Otros consejos

Se podría añadir la referencia de botón y el índice (i) de cada botón a un mapa hash que va a crear ellos.

En un oyente su acción, se puede consultar el índice del botón que proviene del evento en su HashMap por su referencia botón.

Algo como esto (pseudo código, así que por favor no me downvote si no compila):

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++;
}

¿Por qué no configurar sus ActionListeners fuera del bucle y realizar una serie de ellos, donde el índice de la actionListener en su conjunto corresponde a los oyentes qué botón que se agrega a. Algo como esto:

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]);
}

advertencia, sin embargo, no he probado este código.

Su primer problema reside en la dependencia de j variable.

Usted está asignando todos los botones exactamente el mismo ActionListener, que imprimiría el objeto en j índice, que en el momento en que se muestran los botones es == el último índice de la lista en el momento de los incrementos, Lista de 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();
                }
                });
               }
            }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top