TransWikia.com

Ejecutar y parar un metodo java cada cierto tiempo

Stack Overflow en español Asked by Cesar Jimenez on November 26, 2020

Estoy buscando alguna forma de poder ejecutar un método cada 5 o 10 segundos para recargar los datos de un panel. Dentro de mi proyecto hay algunos panels que según el flujo de trabajo estarán recibiendo datos y/o creando componentes en ejecución, pero no en todos será igual. Ejemplo:

Este dashboard recargará su información cuando el usuario lo desee (botón azul de recargar) o bien cada 3 segundos mientras se esté mostrando el dashboard, lo cual sé que podré hacerlo con algo como esto:

public void reload() {
    Timer timer = new Timer(3000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent ae) {
            //Código que trae datos de la BD 
            System.out.println("RECARGA DE DATOS DE DASHBOARD");
        }
    });

    timer.start();        
}    

Lo llamo en el constructor para que inicie desde el momento en que se instancia el dashboard.

    public pnlDashboard() {

    initComponents();
    this.reload();


}

Y la ejecución sucede así:

Pero si voy a otro panel, por ejemplo a catálogo, sucede esto:

Sigue ejecutándose lo cual entiendo pues nunca le ordeno detenerse, entonces esa es mi duda, ¿cómo podría detener/iniciar una acción de ese tipo al cambiar de panel? En este momento no me tira ningún error pues solo ejecuto una impresión de linea, pero seguramente cuando se trate de setear datos en componentes que no están visibles obtendré un error. El código para cambiar de panel es el siguiente:

package panels;


import javax.swing.JPanel;
import org.netbeans.lib.awtextra.AbsoluteConstraints;

public class CambiaPanel {
private JPanel container;
private JPanel content;

public CambiaPanel(JPanel container, JPanel content) {
    this.container = container;
    this.content = content;
    this.container.removeAll();
    this.container.revalidate();
    this.container.repaint();


    this.container.add(this.content, new AbsoluteConstraints(0,0,-1,-1));
    this.container.revalidate();
    this.container.repaint();




}

}

No en todos los panels tendré necesidad de realizar esto, solo en unos cuantos, pero no concibo una idea.
Ideas, sugerencias son bienvenidas. Gracias por su tiempo.

2 Answers

Se me ocurre men pero no se si funcione tal cual. Me imagine usar variables booleans por cada panel que deses poner un Timer(), entonces cuando entres a un botón ya sea producción, catalago , inventario etc vas a crear una variables booleana y con esa dentro de una condición detienes

public class Programa {

Timer tCat, tProd;
ActionListener al, al1;
boolean bandCat,bandProd;

public Programa (){
    bandCat = bandProd  = true;
    al = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            metodo();
        }
    };
    tCat = new Timer(1000, al);
}


public void metodo(){
    if ( bandCat ) {
       //Código que trae datos de la BD 

        System.out.println("RECARGA DE DATOS DE DASHBOARD");
    } else {
       tCat.stop();
    }
}

//nose si sean botones o label pero cada vez que se clickea cambiamas las banderas
// para que el timer se detenga y continue el que se clickeo
private void botonCatalagoActionPErformand(){
    bandCat = false;
    bandProd = true;
}
private void botonProductionActionPErformand(){
    bandProd = false;
    bandCat = true;
}
}

usando otro metodo para cada panel y pues ya tu sabras donde iniciarlizar los timers que uses

ESpero y te ayude men. Por cierto como hiciste el menu desplegable que tienes a la izquierda???

Answered by JarhChuy on November 26, 2020

De preferencia, debes de crear hilos para cada panel; así, tendrás el control de que panel deseas iniciar su actualización o detenerla.

Así creas un hilo:

public class HILO1 extends Thread {
    public Thread h1;
    NewJFrame objeto;
    public HILO1(NewJFrame m){
        objeto=m;
    }
   @Override
    public void run()  //METODO RUN PARA EL HILO
    {
       int conta1 = 0;
       while(true){
           if (conta1==9){
               conta1=0;
           }
           else {
               conta1++;
           }
           objeto.jLabel1.setText((String.valueOf(conta1)));
           try {
               Thread.sleep(500);
           } catch (InterruptedException ex) {
               Logger.getLogger(HILO1.class.getName()).log(Level.SEVERE, null, ex);
           }
       }
    }
}

Y así lo mandas a llamar.

HILO1 mihilo1;
mihilo1 = new HILO1(this);
mihilo1.start(); //inicia hilo1

Ten en cuenta que así comienzas el hilo, si deseas deternerlo puedes usar mihilo1.stop(); pero tienes que crear un nuevo objeto HILO para que puedas volver a comenzar la cuenta ya que si no lo haces, puedes tener un error.

Answered by Marcelino on November 26, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP