Foros del Web » Programación para mayores de 30 ;) » Java »

Reto curioso con botones

Estas en el tema de Reto curioso con botones en el foro de Java en Foros del Web. Saludos. Tengo el siguiente código, donde etiqueta es un String y panelContenedor es un JPanel: for(int i=0; i<10; i++) { etiqueta = Integer.toString(i); panelContenedor.add(new JButton ...
  #1 (permalink)  
Antiguo 10/04/2009, 09:25
 
Fecha de Ingreso: septiembre-2007
Mensajes: 122
Antigüedad: 16 años, 7 meses
Puntos: 1
Reto curioso con botones

Saludos.

Tengo el siguiente código, donde etiqueta es un String y panelContenedor es un JPanel:

for(int i=0; i<10; i++)
{
etiqueta = Integer.toString(i);
panelContenedor.add(new JButton (etiqueta));
}

Lo que hace es generar 10 botones y añadirlos al panelContenedor. Mi pregunta es como hago para generar 10 eventos diferentes, uno por cada botón, ya que si hago lo siguiente:

JButton x;
for(int i=0; i<10; i++)
{
etiqueta = Integer.toString(i);
x = new JButton (etiqueta);
x.addActionListener......................
panelContenedor.add(x);
}

Muestra los 10 botones, pero se dispararía el mismo evento para todos sin importar cual presione. Lo que necesito es como individualizar los eventos, ¿cómo lo hago?

Gracias por sus aportes
  #2 (permalink)  
Antiguo 10/04/2009, 12:32
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Reto curioso con botones

Hola:

Lo normal es añadir a cada botón también un x.setActionCommand(unString) en el que le pasas un String que identifique de alguna forma qué hace el botón. Luego añades el mismo actionListener a todos los botones y en el ActionEvent que recibes, puedes preguntar por el getActionCommand, para distinguir qué botón es el que ha lanzado el evento

Código:
x = new JButton(etiqueta);
x.setActionCommand(etiqueta); // o el texto que quieras
x.addActionListener (el listener);
...
// y en el código de actionPeformed()
public void actionPerformed (ActionEvent e) {
   String etiqueta = e.getActionCommand();
   if (etiqueta.equals("...")) {
      ....
   } else if (etiqueta.equals("...")) {
   } ...
}
De todas formas, si lo que hay que hacer en cada botón es muy distinto, lo mejor es hacer un ActionListener específico para cada botón.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 11/04/2009, 10:51
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Reto curioso con botones

Aun sin poner actionCommands, el objeto ActionEvent tiene un metodo getSouce(), como cualquier evento, para saber que componente lo ha producido.

De todas formas, como dice Chuidiang lo importante es que decidas si quieres un gestor de eventos distinto para cada botón, o el mismo y distingas dentro del tratamiento de los eventos de que botón te viene.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #4 (permalink)  
Antiguo 11/04/2009, 21:06
 
Fecha de Ingreso: septiembre-2007
Mensajes: 122
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Reto curioso con botones

La respuesta es sencilla..... Se hace con un arreglo de botones, así por la posición se puede saber que evento se asocia a determinado botón.

De todas maneras, gracias por sus aportes

JButton [] botones = new JButton [nroBotones];

for(int i=0; i<nroBotones; i++)
{
final int x = i;
etiqueta = Integer.toString(i+1);
botones[i] = new JButton (etiqueta);
botones[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
botones[x].setVisible(false);
}

});
panelContenedor.add(botones[i]);
}
  #5 (permalink)  
Antiguo 13/04/2009, 08:28
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Reto curioso con botones

Jejeje, bueno, si tu crees que es por la posición, aceptamos barco .
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #6 (permalink)  
Antiguo 13/04/2009, 12:56
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Reto curioso con botones

Buenas:

El usar actionCommand() o getSource() en principio es indistinto, salvo por una sutil diferencia.

Imagina un botón de "salvar" típico en cualquier aplicación. Es posible que esa acción "salvar" esté disponible dentro de la misma aplicación en un menú, en un botón de una barra de herramientas y quizás en algún sitio más que se te ocurra. Si usas actionCommand, basta llamar setActionCommand("salvar") a todos los posibles botones, menús y chismes que tengan esa acción y una única comparación (actionCommand=="salvar") bastaría.

Código:
JMenuItem itemSalvar = new JMenuItem(...);
itemSalvar.setActionCommand("salvar");
...
JButton botonSalvar = new JButton(....);
botonSalvar.setActionCommand("salvar");
...
public void actionPerformed (ActionEvent e) {
    if ("salvar".equals(e.getActionCommand()) {
        // salvar.
    }
}

Con getSource() deberías poner tantas comparaciones como posibles chismes distintos puedan realizar la acción de salvar.

Código:
JMenuItem itemSalvar = new JMenuItem(...);
...
JButton botonSalvar = new JButton(....);
...
public void actionPerformed (ActionEvent e) {
    if ((e.getSource() == itemSalvar) ||
         (e.getSource() == botonSalvar) ) {
        // salvar.
    }
}

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 14/04/2009, 00:13
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Reto curioso con botones

Sí, sólo quería decir que había otra opción, por si acaso no podía usar la del action command. Si se puede, lo más recomendable es usar el action command, como tu dices por que se puede reutilizar y no sólo con botones, pero a falta de pan...

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:53.