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

[SOLUCIONADO] Funcion timer que funcione para multiples componentes

Estas en el tema de Funcion timer que funcione para multiples componentes en el foro de Java en Foros del Web. Hola me preguntaba como puedo hacer que esta función, pueda funcionar para múltiples botones ya que intente agregarla luego de probarla por aparte pero si ...
  #1 (permalink)  
Antiguo 16/02/2018, 00:21
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años, 7 meses
Puntos: 3
Funcion timer que funcione para multiples componentes

Hola me preguntaba como puedo hacer que esta función, pueda funcionar para múltiples botones ya que intente agregarla luego de probarla por aparte pero si inicia el conteo de PC1, la cosa que al iniciar el de PC2 no actualiza el tiempo en dicho botón y solo suma es decir el primer contador va mas rápido ayuda el codigo es el siguiente

Código Java:
Ver original
  1. private Timer t;
  2.  
  3. t = new Timer(10, tiempo)
  4.  
  5.     private int h, m, s, cs;
  6.     private ActionListener tiempo= new ActionListener(){
  7.  
  8.         @Override
  9.         public void actionPerformed(ActionEvent ae) {
  10.             ++cs;
  11.             if(cs==100){
  12.                 cs = 0;
  13.                 ++s;
  14.             }
  15.             if(s==60)
  16.             {
  17.                 s = 0;
  18.                 ++m;
  19.             }
  20.             if(m==60)
  21.             {
  22.                 m = 0;
  23.                 ++h;
  24.             }
  25.             actualizarLabel();
  26.         }
  27.        
  28.     };
  29.    
  30.     private void actualizarLabel() {
  31.        // String tiempo = (h<=9?"0":"")+h+":"+(m<=9?"0":"")+m+":"+(s<=9?"0":"")+s+":"+(cs<=9?"0":"")+cs;
  32.         String tiempo = (h<=9?"0":"")+h+":"+(m<=9?"0":"")+m+":"+(s<=9?"0":"")+s;
  33.         etiquetaTiempo.setText(tiempo);
  34.     }

__________________
Desbloquea esos limites...
  #2 (permalink)  
Antiguo 16/02/2018, 02:11
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Funcion timer que funcione para multiples componentes

Para que eso funcione en múltiples botones debería tener una única instancia.

Investiga sobre el patrón singleton e intenta aplicarlo a tu Timer.

Luego haz los métodos necesarios para que los botones puedan acceder a la instancia y trabajar con ella.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 16/02/2018, 20:32
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años, 7 meses
Puntos: 3
Respuesta: Funcion timer que funcione para multiples componentes

He leído, y tratado de implementar el patron singleton de la siguiente manera:

Código Java:
Ver original
  1. public class timer {
  2.     private static timer unicoTimer;
  3.     private Timer t = null;
  4.     private int h, m, s, cs;
  5.    
  6.     JLabel Ltiempo = null;
  7.    
  8.     public static timer getInstancia(){
  9.         if(unicoTimer == null)
  10.             unicoTimer = new timer();
  11.         return unicoTimer;
  12.        
  13.     }
  14.    
  15.     private timer(){}
  16.    
  17.     public void ejecutar(JLabel Label){  
  18.    
  19.     Ltiempo = Label;    
  20.     ActionListener tiempo = new ActionListener(){
  21.        
  22.         @Override
  23.         public void actionPerformed(ActionEvent ae) {
  24.             ++cs;
  25.             if(cs==100){
  26.                 cs = 0;
  27.                 ++s;
  28.             }
  29.             if(s==60)
  30.             {
  31.                 s = 0;
  32.                 ++m;
  33.             }
  34.             if(m==60)
  35.             {
  36.                 m = 0;
  37.                 ++h;
  38.             }
  39.            
  40.             actualizarLabel();
  41.         }
  42.        
  43.     };
  44.    
  45.        
  46.         t = new Timer(10, tiempo);
  47.     }
  48.    
  49.     private void actualizarLabel() {
  50.        
  51.        
  52.        // String tiempo = (h<=9?"0":"")+h+":"+(m<=9?"0":"")+m+":"+(s<=9?"0":"")+s+":"+(cs<=9?"0":"")+cs;
  53.         String tiempo = (h<=9?"0":"")+h+":"+(m<=9?"0":"")+m+":"+(s<=9?"0":"")+s;
  54.        Ltiempo.setText(tiempo);
  55.      
  56.     }
  57.    
  58.     public void start(){
  59.        
  60.         t.start();
  61.     }
  62.    
  63.     public void pausa(){
  64.        
  65.         t.stop();
  66.     }
  67.     public void running(JButton stop){
  68.                
  69.         if(t.isRunning())
  70.         {
  71.             t.stop();
  72.             stop.setEnabled(true);
  73.         }
  74.        
  75.         h=0; m=0; s=0; cs=0;
  76.         actualizarLabel();
  77.     }
  78.  
  79. }

Lo inicio de esta manera:
Código Java:
Ver original
  1. timer.getInstancia().ejecutar(etiquetaTiempo);
  2.         timer.getInstancia().start();
  3.         btnStart.setEnabled(false);
  4.         btnStart.setText("Reanudar");
  5.         btnPause.setEnabled(true);
  6.         btnStop.setEnabled(true);

Se pausa asi:
Código Java:
Ver original
  1. timer.getInstancia().pausa();
  2.         btnStart.setEnabled(true);
  3.         btnPause.setEnabled(false);

y se detiene:
Código Java:
Ver original
  1. timer.getInstancia().running(btnStop);
  2.         btnStart.setText("Iniciar");
  3.         btnPause.setEnabled(false);
  4.         btnStop.setEnabled(false);


Pero sigue sin funcionar al implementarlo aun segundo "Cronometro", no se que pasa pues inicio el primero y funciona, pero al correr el segundo el primero se paraliza y el segundo inicia desde donde se quedo el primero y aumenta la velocidad

Creo no entendí bien el patrón o mi sintaxis es errónea
__________________
Desbloquea esos limites...
  #4 (permalink)  
Antiguo 17/02/2018, 14:57
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Funcion timer que funcione para multiples componentes

Descontando el tema de la nomenclatura, prueba a cambiar lo siguiente

t = new Timer(10, tiempo);

por

if (t == null) {
t = new Timer(10, tiempo);
}

Si el problema derivado de esto es que tienes diferentes ActionListener y debe cambiar el valor de t para añadir el nuevo ActionListener lo que tienes que hacer es

if (t != null) {
int delay = t.getDelay();
t = new Timer(delay, tiempo);
} else {
t = new Timer(10, tiempo);
}


;)
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 17/02/2018, 16:38
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años, 7 meses
Puntos: 3
Respuesta: Funcion timer que funcione para multiples componentes

Pues he intentado con el código que has dejado primero, funciono aunque no del todo pues el primero se paralizo al comenzar el segundo...

Código Java:
Ver original
  1. if (t == null) {
  2. t = new Timer(10, tiempo);
  3. }

luego cambie por el otro código he igual se detuvo el primero y el segundo se acelero.. Por cierto no entendí a que te refieres con usar varios ActionListener el único que uso es el que vez en el código y estoy tratando de que funciones en múltiples botones es decir varios cronómetros de tiempo pero no logro que funcionen :(
__________________
Desbloquea esos limites...
  #6 (permalink)  
Antiguo 17/02/2018, 22:08
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Funcion timer que funcione para multiples componentes

A lo que me refiero es a que tienes que conseguir recuperar el estado del cronómetro que se está ejecutando a cada evento que se produzca.

Si no puedes mantener el mismo cronómetro lo que tienes es que inicializar otro nuevo pero con el mismo estado inicial que el estado final del cronómetro anterior que tengas inicializado anteriormente.

A ver si puedes conseguirlo.

Un saludo.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #7 (permalink)  
Antiguo 19/02/2018, 11:19
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Funcion timer que funcione para multiples componentes

Por una duda que tengo, prueba también con este código

if (t != null) {
if(t.isRunning()) {
t.stop();
}
int delay = t.getDelay();
t = new Timer(delay, tiempo);
} else {
t = new Timer(10, tiempo);
}
t.start();

y comenta la línea de la ejecución principal

timer.getInstancia().start();
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #8 (permalink)  
Antiguo 20/02/2018, 19:33
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años, 7 meses
Puntos: 3
Respuesta: Funcion timer que funcione para multiples componentes

Hola revise como me has dicho pero no me funcionaba me paralizaba ambos timers, la verdad es que cambie el timer y lo implemente con un Thread y lo hice runnable, y ya con eso me permitió usar de dos a mas timer en tiempo de ejecución y sin perjudicar a los ya iniciados, pero gracias la verdad siento que de haber continuado con el uso de Timer lo hubiese logrado pero bueno estoy poco falto de tiempo... gracias Fuzzylog
__________________
Desbloquea esos limites...

Última edición por sgrajaleshdz; 20/02/2018 a las 19:34 Razón: mal escrito

Etiquetas: ciber, componentes, netbeans, pcs
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:25.