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

JButtons en un ArrayList

Estas en el tema de JButtons en un ArrayList en el foro de Java en Foros del Web. Hola amigos, a ver si me pueden dar una manito. En una parte de mi programa tengo una ventana con 5 botones que se comportan ...
  #1 (permalink)  
Antiguo 29/06/2009, 09:37
 
Fecha de Ingreso: febrero-2009
Mensajes: 225
Antigüedad: 15 años, 2 meses
Puntos: 4
JButtons en un ArrayList

Hola amigos, a ver si me pueden dar una manito.

En una parte de mi programa tengo una ventana con 5 botones que se comportan de la misma menera, pero su ImageIcon es diferente.

Código PHP:
private void setCartasJugador() {
        
cartasJugadorJButtons = new ArrayList();
        for(
int i=0i<cartasJugador.size(); i++) {
            
Carta tmpCarta = (CartacartasJugador.get(i);
            
String nombre tmpCarta.toString();
            
ImageIcon bgCarta = new ImageIcon("Imagenes/Cartas/" nombre ".png");
            
jbCarta = new JButton(bgCarta);
            
jbCarta.setVisible(true);
            
jbCarta.setBounds(setCartasJugadorPosicion(i));
            
setearAccionCartasJugador();
            
cartasJugadorJButtons.add(jbCarta);
        }
    } 
Para no repetir codigo lo que hice fue un loop, que crea los botones 1 a 1 y los pone en un ArrayList. Y luego recorriendo el ArrayList los agrego al JContentPane.

Ahora tengo un problema al intentar setearle a los botones un ActionListener. Lo que estoy haciendo es recorriendo el ArrayList de JButtons y agregandole a cada uno la accion (la cual es la misma, cambiar el ImageIcon si se hace click en el).

Pero cuando le agrego la accion a los botones:

Código PHP:
private void setearAccionCartasJugador() {
        
jbCarta.addActionListener(new java.awt.event.ActionListener() {
        public 
void actionPerformed(java.awt.event.ActionEvent e) {
            
ImageIcon bg = new ImageIcon("Imagenes/Cartas/back.png");
            
jbCarta.setIcon(bg);
        }});
    } 
Lo quice hacer de esta forma. El problema es que jbCarta es una variable de clase, que la uso solamente como apoyo, le asigno la direccion de memoria del JButton que estoy modificando, solo temporlamente.

Y lo que me esta sucediendo, es que al hacer click en cualquiera de estos botones. El unico que cambia es el ultimo JButton que fue asignado a jbCarta.

Queria saber si hay una forma de hacer lo que quiero. Si existe algun tipo de funcion que me permita tomar el objeto al cual se le esta agregando el ActionListener. Algo similar a getParent() pero para esta situacion. Ya que si pongo "this" estoy haciendo referencia al ActionListener y no al boton.

Me gustaria ahorrarme el crear cada boton por separado.

Un saludo, y gracias!
  #2 (permalink)  
Antiguo 29/06/2009, 10:42
 
Fecha de Ingreso: abril-2009
Mensajes: 82
Antigüedad: 15 años
Puntos: 2
Respuesta: JButtons en un ArrayList

Buenas:

El problema reside en que tu jbCarta cambia con el tiempo, con lo cual siempre al final del bucle se queda con la dirección del último botón como tu muy bien dices. Si lo que quieres es pasar el botón, hazlo como parámetro al constructor, es decir, algo como:

Código:
public class MyActionListener implements ActionListener {

    private JButton jbCarta;

    public MyActionListener(JButton jbCarta) {
        this.jbCarta = jbCarta;
    }

    public void actionPerformed(ActionEvent e) {
        ImageIcon bg = new ImageIcon("Imagenes/Cartas/back.png");
        this.jbCarta.setIcon(bg);
    }

}
Obviamente, para hacer esto, tienes que crear la clase MyActionListener como una clase independiente. Y tendrás que asignarlo adecuadamente, claro:

Código:
private void setCartasJugador() {
        cartasJugadorJButtons = new ArrayList();
        
        for(int i=0; i<cartasJugador.size(); i++) {
            Carta tmpCarta = (Carta) cartasJugador.get(i);
            String nombre = tmpCarta.toString();
            ImageIcon bgCarta = new ImageIcon("Imagenes/Cartas/" + nombre + ".png");
            jbCarta = new JButton(bgCarta);
            jbCarta.setVisible(true);
            jbCarta.setBounds(setCartasJugadorPosicion(i));
            jbCarta.addActionListener(jbCarta);
            cartasJugadorJButtons.add(jbCarta);
        }
}
Saludos
  #3 (permalink)  
Antiguo 29/06/2009, 14:06
 
Fecha de Ingreso: febrero-2009
Mensajes: 225
Antigüedad: 15 años, 2 meses
Puntos: 4
Respuesta: JButtons en un ArrayList

muchisimas gracias!! muy buena idea!

lo unico diferente fue que tuve que escribir :
jbCarta.addActionListener(new MyActionListener(jbCarta);
  #4 (permalink)  
Antiguo 29/06/2009, 19:45
Avatar de JairLizcano  
Fecha de Ingreso: junio-2008
Ubicación: Santander, Colombia
Mensajes: 608
Antigüedad: 15 años, 10 meses
Puntos: 53
Respuesta: JButtons en un ArrayList

Un consejo:
Código:
public class Ejemplo{

public Ejemplo(){}

public void matriz(){
JButton matrizBotones [] = new JButton [5];

for(int i = 0; i < 5; i++){

matrizBotones [i] = new JButton();
}
}
}
  #5 (permalink)  
Antiguo 29/06/2009, 20:12
 
Fecha de Ingreso: junio-2009
Mensajes: 65
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: JButtons en un ArrayList

Efectivamente, no es necesario un ArrayList para eso...

Con el código anterior de un array con 5 posiciones suficiente, incluso luego puedes hacer un for each a pelo y tirando mucho mas limpio.

Saludos!
  #6 (permalink)  
Antiguo 29/06/2009, 20:28
 
Fecha de Ingreso: febrero-2009
Mensajes: 225
Antigüedad: 15 años, 2 meses
Puntos: 4
Respuesta: JButtons en un ArrayList

lo que pasa es que nos hacen trabajar con java 1.4.2; el for each todavia no existia.

Cual seria la ventaja de usar un Array de 5 posiciones contra usar un ArrayList? gracias
  #7 (permalink)  
Antiguo 29/06/2009, 20:47
Avatar de JairLizcano  
Fecha de Ingreso: junio-2008
Ubicación: Santander, Colombia
Mensajes: 608
Antigüedad: 15 años, 10 meses
Puntos: 53
Respuesta: JButtons en un ArrayList

Algo más bonito, estructura un método para asignar un valor a dicha matriz. Al igual un método para llamar sus indices y acondicionas que sea menor a matriz.lenght(), ello seria una buena practica.
  #8 (permalink)  
Antiguo 30/06/2009, 05:23
 
Fecha de Ingreso: junio-2009
Mensajes: 65
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: JButtons en un ArrayList

Y sobre todo que no recargas tanto el código, no le cuesta lo mismo cargar un ArrayList que un array de 5 posiciones, aunque hoy en dia es un poco igual, pero bueno, nunca está demás si se trata de un programa de bastantes lineas optimizar un poco.

Saludos!
  #9 (permalink)  
Antiguo 30/06/2009, 07:43
 
Fecha de Ingreso: febrero-2009
Mensajes: 225
Antigüedad: 15 años, 2 meses
Puntos: 4
Respuesta: JButtons en un ArrayList

Bueno muchas gracias por todo! Esto es un juego de poker medio basico que estoy programando como proyecto para la universidad. Luego de entregarlo puedo postear el codigo, si les interesa. Saludos! =)
  #10 (permalink)  
Antiguo 30/06/2009, 07:50
 
Fecha de Ingreso: junio-2009
Mensajes: 65
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: JButtons en un ArrayList

No estaría mal para probarlo y verlo...

Saludos.

PD: Proyecto de fin de carrera???...
  #11 (permalink)  
Antiguo 30/06/2009, 09:25
Avatar de JairLizcano  
Fecha de Ingreso: junio-2008
Ubicación: Santander, Colombia
Mensajes: 608
Antigüedad: 15 años, 10 meses
Puntos: 53
Respuesta: JButtons en un ArrayList

Cita:
Iniciado por Newbie001 Ver Mensaje
Bueno muchas gracias por todo! Esto es un juego de poker medio basico que estoy programando como proyecto para la universidad. Luego de entregarlo puedo postear el codigo, si les interesa. Saludos! =)
Éy Newbie001, igual estoy terminando el juego de Othello, nunca habia empezado a programar juegos en Java y estoy haciendo las practicas de Swing con algunos juegos, en este momento sólo algo personal.

Contactame y publicamos nuestros proyectos en un sitio que diseñemos, algunos campos de texto y algunos comentarios.
  #12 (permalink)  
Antiguo 30/06/2009, 20:28
 
Fecha de Ingreso: febrero-2009
Mensajes: 225
Antigüedad: 15 años, 2 meses
Puntos: 4
Respuesta: JButtons en un ArrayList

Cita:
Iniciado por moisesvs Ver Mensaje
No estaría mal para probarlo y verlo...

Saludos.

PD: Proyecto de fin de carrera???...
no no, es para el 3º semestre. Diseño y desarrollo de aplicaciones es la materia

Cita:
Iniciado por JairLizcano Ver Mensaje
Éy Newbie001, igual estoy terminando el juego de Othello, nunca habia empezado a programar juegos en Java y estoy haciendo las practicas de Swing con algunos juegos, en este momento sólo algo personal.

Contactame y publicamos nuestros proyectos en un sitio que diseñemos, algunos campos de texto y algunos comentarios.
dale puede estar bueno
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 22:47.