No puedo parar o cancelar un Timer desde otra clase. Chale!!
Me Pone este mensaje en la consola de eclipse al dar clic a un JButton que desencadena el evento de parar "PararPC1" :
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: unable to create new native thread.
__________________________________________________________________________________
EL CODIGO QUE MI PRIMERA CLASE DONDE HAGO EL TIMER ES ESTE (Cronometro.java):
package Cyber;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JTextField;
public class Cronometro{
private Timer timer;
private String tiempo;
private TimerTask task;
private int horasCronometro, minutosCronometro, segundosCronometro;
public Cronometro(){
tiempo = "00:00:00";
}
public void Cronometrar(JTextField jTextField){
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
++segundosCronometro;
if (segundosCronometro == 60) {
segundosCronometro = 0;
++minutosCronometro;
}
if (minutosCronometro == 60) {
minutosCronometro = 0;
++horasCronometro;
}
tiempo = (horasCronometro <= 9 ? "0" : "") + horasCronometro + ":"
+ (minutosCronometro <= 9 ? "0" : "") + minutosCronometro + ":"
+ (segundosCronometro <= 9 ? "0" : "") + segundosCronometro;
jTextField.setText(String.valueOf(tiempo));
}
};
timer.scheduleAtFixedRate(task, 0, 1000);
}
public Timer getTimer(){
return timer;
}
public String getTiempo(){
return tiempo;
}
public TimerTask getTask(){
return task;
}
public void CronometrarAuto(String TiempoGuardado){}
}
__________________________________________________________________________________
PARTE DE MI CODIGO DE LA OTRA CLASE (ControlCyber.java) donde esta el metodo "actionPerformed" para parar el "Timer", Y EN DONDE ESTA EL PROBLEMA ES EL SIGUIENTE:
public void actionPerformed(ActionEvent e) {
String name = e.getActionCommand();
Cronometro Cronometro1 = new Cronometro();
switch (name){
case "IniciarPC1":
Cronometro1.Cronometrar(txtCronometro1);
break;
case "PararPC1":
Cronometro1.getTimer().cancel();
System.out.print("jaja");
break;
............abajo hay más código pero no importa
__________________________________________________________________________________
AL DAR CLIC En el boton "IniciarPC1" no hay problelma, se inicia el Cronometro o timer. El problema es cuando doy clic en el boton "ParaPC1", ahí es donde me marca este error:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: unable to create new native thread.
Osea se supone que instanciando la variable "timer" a traves de getTimer() y Dando getTimer().cancel(); se debe parar el timer. Pero no lo hace, sino que me pone el error de arriba.
LO SOLUCIONO DECLARANDO LA VARIABLE "timer" (de Cronometro.java) como Static, y si funciona así, si para el timer y deja de correr el cronometro como quiero. Pero yo no quiero usar la variable como Estatica, la quiero privada y encapsulada como debe ser. Y aparte como tengo mas cronometros SI LA DELCARO ESTATICA, si doy cancel() a uno se paran todos, por eso NO quiero que sea timer static
Ayuda!!!! No encuentro ayuda en ningun foro sobre esto. Chale!!!!!!!
- Inicie sesión o regístrese para enviar comentarios
Cada vez que tu das un clic a
Cada vez que tu das un clic a un botón llamas al método
actionPerformed
y cada vez que lo haces creas una nueva instancia de la claseCronometro
. Entonces, estas deteniendo un objecto distinto, por eso, cuando colocas la variabletimer
como estática funciona pues es visible.Yo creo que podrías hacer un método que detuviera el timer, dentro de la clase
Cronometro
y aplicaras otra lógica para activar/desactiva tus timers.Por cierto, utiliza los tags, para poder leer mejor tu código.
Saludos.
Gracias por responder
Prmero Gracias por tu respuesta. Eso que me dices me da una pista para resolverlo. Trataré de hacer ese metodo que dices, haber que pasa. Y lo de las TAGS, desconosco cuales se usen para encerrar el codigo dentro de ellas. Podrías decirme?.
Espero alguien tenga otra idea aparte de la de José Manuel. Un ejemplo con código estaría genial.
Re: Chale!!