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

[SOLUCIONADO] Problema con array de botones que escuchen 2 eventos

Estas en el tema de Problema con array de botones que escuchen 2 eventos en el foro de Java en Foros del Web. Hola, Saludos a todos... Ya se de nuevo aquí molestando Esta vez tengo un problema con un 'array de botones' , pasa que por medio ...
  #1 (permalink)  
Antiguo 09/02/2018, 23:22
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años
Puntos: 3
Pregunta Problema con array de botones que escuchen 2 eventos

Hola, Saludos a todos... Ya se de nuevo aquí molestando

Esta vez tengo un problema con un 'array de botones', pasa que por medio de una clase se crean y escuchan a un 'ActionListener' que se encuentra en el mismo array, intento que el los botones escuchen 2 instrucciones, la primera vez que efectué la primer acción 'Desbloquear el PC' y la segunda que revierta es decir 'Bloquee el PC'

El codigo es el siguiente:
Código Java:
Ver original
  1. public void init(List<String> clients) {
  2. //Clients recibe las ip de los clientes que se conectan a mi servidor
  3.     int a = Integer.parseInt(numM.getText());
  4.     int x = clients.size(); //Aquí leo cuantos son y dependiendo de eso se crea en num de botones
  5.    
  6.        if(x!=a){
  7.        
  8.            Pcs.removeAll();
  9.            Pcs.repaint();
  10.            pack();
  11.            
  12.             JButton[] botones =new JButton[x];
  13.        
  14.             for (int i=0; i<botones.length; ++i){
  15.                     botones[i]=new JButton("Libre PC"+(1+i));
  16.                     String pc = clients.get(i);
  17.                     //botones[i]=new JButton(pc);
  18.                     //botones[i].setBorder(null);
  19.                     //botones[i].setBorderPainted(false);
  20.                     //botones[i].setContentAreaFilled(false);
  21.                     botones[i].setDefaultCapable(false);
  22.                     //botones[i].setFocusPainted(false);
  23.                     //botones[i].setFocusable(false);
  24.                     botones[i].setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
  25.                     botones[i].setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
  26.                     botones[i].setToolTipText(pc);
  27.                     Pcs.add(botones[i]);
  28.                     repaint();
  29.                     numM.setText(String.valueOf(x));
  30.                    
  31.                     botones[i].addActionListener(new ActionListener() {
  32.                        @Override
  33.                        public void actionPerformed(ActionEvent ae) {
  34.                            /////////////////////////////////////////////////////////////////                                
  35.                                    
  36.                            for(int j=0;j<botones.length;j++){
  37.                                         int num=j+1;
  38.                                        
  39.                                     if( botones[j].getText().equals("Libre PC"+num) )
  40.                                         {
  41.                                         System.out.println("Libre PC"+num);
  42.                                         String a = botones[j].getToolTipText();
  43.                                         botones[j].setText("Ocupada PC"+num);
  44.                                         blo(a);
  45.                                         break;
  46.                                         }
  47.                                        
  48.  // He probado quitar, cambiar y dejar en uno o en otro el 'break' pero ni así funciono
  49.                                    
  50.                                         if( botones[j].getText().equals("Ocupada PC"+num) )
  51.                                         {
  52.                                         System.out.println("Ocupada PC"+num);
  53.                                         String a = botones[j].getToolTipText();
  54.                                         botones[j].setText("Libre PC"+num);
  55.                                         desblo(a);
  56.                                         break;
  57.                                         }
  58.                                        
  59.                                        
  60.                                    
  61.                                     }
  62.     ///////////////////////////////////////////////////////////////////////////                                
  63.                        }
  64.                    });
  65.                     pack();
  66.             }
  67.        }
  68.     }

Tuve que usar otro 'for' con 'int j', por que no me dejaba usar 'i' y el problema de hacerlo global es que 'i' suma sus valores y ya no coinciden los nombre de botón

Espero puedan ayudarme, pues no encuentro como ya probé usando while antes y después del 'for' con 'int j'

Gracias, por leerme
__________________
Desbloquea esos limites...
  #2 (permalink)  
Antiguo 10/02/2018, 08:08
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Problema con array de botones que escuchen 2 eventos

1º Si tu action listener va a recorrer el array de botones asegurate de que ese array es una variable global que pueda ser accesible. (creo que esto lo tienes bien)

2º La asignación del action listener la haría previa a la instrucción

Pcs.add(botones[i]);

porque una vez hecho el repaint no tienes disponible el listener.

Una vez hagas el cambio del punto 2 haz debug del código a ver si te funciona.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 10/02/2018, 11:47
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años
Puntos: 3
Respuesta: Problema con array de botones que escuchen 2 eventos

Hola, he hecho los cambios que me has sugerido pero sigue sin funcionar, sin embargo probé comentando las siguientes lineas del código:
Código Java:
Ver original
  1. if(x!=a){
  2.        
  3.            //Pcs.removeAll(); **** Esta linea *****
  4.           // Pcs.repaint(); **** y esta otra *****
  5.            pack();
  6.            
  7.             JButton[] botones =new JButton[x];
  8.        
  9.             for (int i=0; i<botones.length; ++i){
:
Obviamente al ser solo 1 PC conectada genera 1 botón, pero al conectarse otra se generan los botones de la PC1 y la PC2, pero deja el antes ya creado, se que se debe a las lineas que comente

Ahora me pregunto ¿habrá una forma de evitar que se cree de nuevo el botón de la PC1, y que solo genere el botón de la PC2?
__________________
Desbloquea esos limites...
  #4 (permalink)  
Antiguo 10/02/2018, 15:02
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Problema con array de botones que escuchen 2 eventos

Simplemente manteniendo el array de botones independiente y añadiendo un nuevo botón al array cada vez que se conecte una nueva máquina, sin recorrer el array de botones.

botones es inicialmente una lista vacia.

List<JButton> botones =new ArrayList<JButton>();

boton=new JButton("Libre PC"+(botones.size()+1));
...
botones.add(boton); // añade a la lista de botones para mantener el control del flujo
Pcs.add(boton);

tira por ahí a ver si llevas tu idea a término
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 15/02/2018, 23:53
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años
Puntos: 3
Gracias a todos!! lo he solucionado

Gracias por el apoyo he logrado solucionar el problema y ya puedo efectuar diferentes acciones aunque aun me faltan muchas pero en realidad el apoyo es excelente
__________________
Desbloquea esos limites...

Etiquetas: arrays, ciber, eventos, listener
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 18:27.