2010-03-02 16 views
16

he presentado una solicitud y necesito para salvar algunas opciones antes de la salida (. Algo así como la dimensión de la ventana, ..., que será escrito en un archivo)¿Cómo guardar las opciones de la aplicación antes de salir? .

El bastidor principal se ha establecido lo siguiente:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

¿Cómo puedo guardar las opciones que me interesa? (antes de salir, por supuesto)

Gracias!

Respuesta

28

Si lo que desea es hacer algo cuando la aplicación se está cerrando, se puede conectar el apagado utilizando t su código:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 

     public void run() { 
      // Do what you want when the application is stopping 
     } 
    })); 

Sin embargo, esto no le permitirá cerrar su ventana. Si es necesario comprobar algo antes de realmente salir, puede anular la windowClosing evento:

addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
     // Do what you want when the window is closing. 
    } 
}); 

Tenga en cuenta que la primera solución - con el gancho de cierre - tiene la ventaja de que no está relacionado con un evento de la ventana, y ser ejecutado incluso si la aplicación es detenida por otro evento (excepto, por supuesto, si el proceso de Java es asesinado brutalmente).

+0

Cuando utilicé el constructor Thread(), se corrompió un archivo que se guardó en el método Thread.run(). Pero cuando utilicé el hilo constructor (Runnable) como se sugiere en este ejemplo, el archivo se guardó correctamente. ¿Tuve suerte o importa el tipo de constructor? – ka3ak

+0

Esto también es muy útil en Procesamiento de applets. Al salir de ellos, void stop() no siempre se llama mientras que este método es. ¡Gracias! : D – Daan

+0

Excepto cuando está utilizando el IDE de procesamiento y sale de un boceto con el botón 'detener', en cuyo caso ni siquiera este método parece funcionar. – rednoyz

1

Puede registrar WindowListener y guardar sus opciones en el método windowClose.

Y, por supuesto

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
4

puede ser el siguiente le ayudará.

  1. Primero necesita leer el archivo de su propiedad. See doc

    Properties properties = new Properties(); 
    try { 
        properties.load(new FileInputStream("filename.properties")); 
    } catch (IOException e) { 
        System.err.println("Ooops!"); 
    } 
    
  2. Segunda añadir controlador de eventos a la ventana, lo que permitirá ahorrar sus datos en file.All propiedad que usted necesita para guardar sólo hay que poner en las propiedades de instancia y almacenarla en la salida

    addWindowListener(new WindowAdapter() { 
        public void windowClosing(WindowEvent e) { 
        try { 
        properties.store(new FileOutputStream("filename.properties"), null); 
        } catch (IOException e) { 
        } 
        } 
    }); 
    

eso es todo, si hubiera entendido a corregir)

+11

** nunca ** tiene bloques de captura vacíos, ni siquiera en el código de ejemplo. Ponga al menos un 'e.printStackTrace()' allí. El código de ejemplo tiene la tendencia desagradable de convertirse en código de producción y todos tenemos que mantenerlo más adelante. –

+0

En realidad, esto no era mío), solo copia rápida/pasada. Pero tienes toda la razón. – ponkin

0

No estoy seguro de que esto se aplique a su situación, pero puede que otros lo naveguen con este hilo. Mi aplicación tiene un ciclo main() y al final tiene while (! Shell.isDisposed). Cuando la aplicación ejecuta ese bucle, y cuando la aplicación se cierra, ese bucle finaliza y se reduce a lo que le sigue en el método principal. Aquí es donde compruebo si el editor está sucio y si las preferencias han cambiado y las manejo según las condiciones. Mi método adjunto al archivo cerrar elimina el shell y llama al método closeCurrent(), pero si alguien hace clic en el ícono de ventana cerrada 'x', aquí cae y reviso si algo está sucio y lo guardo si es necesario.

while (!shlCpbtool.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
    // exit 
    if(dirty){ 
     closeCurrent(); 
    } 
Cuestiones relacionadas