2011-04-28 18 views
11

Necesito ejecutar un método (un método que crea un archivo), cuando salgo de mi programa, ¿cómo voy a hacer esto?¿Se está ejecutando un método al cerrar el programa?

+1

Qué tipo de programa que está desarrollando, una línea de comandos, escritorio, aplicación web, ¿qué? ¿Cómo lo comienzas y cómo lo cierras? –

+0

Lo inicio presionando el botón Ejecutar en Eclipse en este momento, se ejecutará con un archivo .jar cuando lo haya hecho, lo cierra simplemente haciendo clic en el botón normal de cerrar ventanas. Es un juego muy básico en este momento. – Stan

+0

Entonces, ¿es una aplicación Swing, o tal vez una aplicación SWT? –

Respuesta

24

Add shutdown hook. Vea esto javadoc.

Ejemplo:

public static void main(String[] args) { 
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
     public void run() { 
      System.out.println("In shutdown hook"); 
     } 
    }, "Shutdown-thread")); 
} 
+0

No estoy muy seguro de cómo puedo implementar esto en mi código. ¿Puedo tener alguna ayuda? – Stan

+0

@Stan He actualizado la respuesta. –

+0

si mira otras preguntas de Stans, no creo que esto sea lo que él necesita. –

7

dado que está utilizando Swing. Cuando cierra su aplicación (presionando el botón Cerrar), puede simplemente ocultar su marco. Ejecute el método que desea, que crea el archivo y luego salga del Marco. Esto daría como resultado una salida elegante. En caso de errores/excepciones, puede registrar eso en un archivo separado.

Este es el código

package test; 

import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 

import javax.swing.JFrame; 

public class TestFrame extends JFrame{ 

    public TestFrame thisFrame; 

    public TestFrame(){ 
     this.setSize(400, 400); 
     this.setVisible(true); 
     this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
    } 

    public static void main(String[] args){ 
     TestFrame test = new TestFrame(); 
     test.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentHidden(ComponentEvent e) { 
       System.out.println("Replace sysout with your method call"); 
       ((JFrame)(e.getComponent())).dispose(); 
      } 
     }); 
    } 

} 

Por favor, tenga en cuenta el uso de ganchos de cierre. Como se da en la Javadoc, afirma que

Cuando la máquina virtual se termina debido a usuario cierre de sesión o el apagado del sistema el sistema operativo subyacente puede sólo permiten una cantidad fija de tiempo en que apagar y salida. Es, por tanto, aconsejable intentar ninguna interacción del usuario o para realizar un cálculo de larga duración en un cierre de gancho

+0

Entonces, puse mi marco.setDefaultCloseOperation (JFrame.HIDE_ON_CLOSE); , pero, ¿cómo iba a ejecutar realmente el método que quiero ahora? – Stan

+0

@Stan: Hola stan, he actualizado con el código. si tiene alguna duda, pregunte – bragboy

+0

y ejecute el método que desee dentro del método componentHidden(). – bragboy

0

También puede añadir una ventana en una estrecha oyente a su aplicación.

0
class ExitThread extends Thread { 

     public void run() { 
      // code to perform on exit goes here 
     } 
    } 

//in main or wherever, beginning of execution 
ExitThread t = new ExitThread(); 
//don't call t.start(), the hook will do it on exit 
addShutdownHook(t); 

no lo he probado, pero eso Debería ponerte en marcha. Además, no tiene que usar el constructor predeterminado si quiere pasar algunos parámetros a ese hilo.

0

addWindowListener es mejor solución:

frame.addWindowListener(new WindowAdapter() 
{ 
    public void windowClosing(WindowEvent we) 
    { 
     // run methods before closing 

try { 

           Runtime.getRuntime().exec("taskkill /f /im java.exe"); 

          } catch (IOException e4) { 
           // TODO Auto-generated catch block 
           e4.printStackTrace(); 
          } 

    } 
}); 
Cuestiones relacionadas