001 package com.croftsoft.core.gui; 002 003 import java.awt.*; 004 import java.awt.event.*; 005 006 import com.croftsoft.core.lang.lifecycle.Destroyable; 007 008 /********************************************************************* 009 * Performs a graceful shutdown of a program when the window is closed. 010 * 011 * <p> 012 * <ol> 013 * <li> Sets window visibility to false.</li> 014 * <li> Calls the destroy() method, in array order, of each of the 015 * Destroyable instances passed via the constructor argument. 016 * Any exceptions are caught, printed, and ignored.</li> 017 * <li> Calls the window dispose() method.</li> 018 * <li> Calls System.exit(0).</li> 019 * </ol> 020 * </p> 021 * 022 * <p> 023 * Example: 024 * <code> 025 * <pre> 026 * frame.addWindowListener ( 027 * new ShutdownWindowListener ( destroyables ) ); 028 * </pre> 029 * </code> 030 * </p> 031 * 032 * <p> 033 * Java 1.1 compatible. 034 * </p> 035 * 036 * @version 037 * 2001-07-20 038 * @since 039 * 2001-03-06 040 * @author 041 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 042 *********************************************************************/ 043 044 public class ShutdownWindowListener 045 extends WindowAdapter 046 ////////////////////////////////////////////////////////////////////// 047 ////////////////////////////////////////////////////////////////////// 048 { 049 050 private Destroyable [ ] destroyables; 051 052 ////////////////////////////////////////////////////////////////////// 053 ////////////////////////////////////////////////////////////////////// 054 055 /********************************************************************* 056 * Main constructor. 057 * 058 * @param destroyables 059 * May be null. 060 *********************************************************************/ 061 public ShutdownWindowListener ( Destroyable [ ] destroyables ) 062 ////////////////////////////////////////////////////////////////////// 063 { 064 this.destroyables = destroyables; 065 } 066 067 /********************************************************************* 068 * Convenience constructor. 069 * 070 * <code> 071 * <pre> 072 * this ( new Destroyable [ ] { destroyable } ); 073 * </pre> 074 * </code> 075 *********************************************************************/ 076 public ShutdownWindowListener ( Destroyable destroyable ) 077 ////////////////////////////////////////////////////////////////////// 078 { 079 this ( new Destroyable [ ] { destroyable } ); 080 } 081 082 /********************************************************************* 083 * Convenience constructor. 084 * 085 * <code> 086 * <pre> 087 * this ( ( Destroyable [ ] ) null ); 088 * </pre> 089 * </code> 090 *********************************************************************/ 091 public ShutdownWindowListener ( ) 092 ////////////////////////////////////////////////////////////////////// 093 { 094 this ( ( Destroyable [ ] ) null ); 095 } 096 097 ////////////////////////////////////////////////////////////////////// 098 ////////////////////////////////////////////////////////////////////// 099 100 public void windowClosing ( WindowEvent windowEvent ) 101 ////////////////////////////////////////////////////////////////////// 102 { 103 Window window = windowEvent.getWindow ( ); 104 105 window.setVisible ( false ); 106 107 if ( destroyables != null ) 108 { 109 for ( int i = 0; i < destroyables.length; i++ ) 110 { 111 try 112 { 113 destroyables [ i ].destroy ( ); 114 } 115 catch ( Exception ex ) 116 { 117 ex.printStackTrace ( ); 118 } 119 } 120 } 121 122 window.dispose ( ); 123 124 System.exit ( 0 ); 125 } 126 127 ////////////////////////////////////////////////////////////////////// 128 ////////////////////////////////////////////////////////////////////// 129 }