001 package com.croftsoft.apps.client; 002 003 import java.awt.*; 004 import java.util.*; 005 import java.util.concurrent.*; 006 import javax.swing.*; 007 008 import com.croftsoft.core.gui.LifecycleWindowListener; 009 import com.croftsoft.core.lang.lifecycle.*; 010 import com.croftsoft.core.util.loop.*; 011 012 /********************************************************************* 013 * Main. 014 * 015 * Launches the application within a framework. 016 * 017 * @version 018 * $Id: ClientMain.java,v 1.7 2006/12/09 05:23:45 croft Exp $ 019 * @since 020 * 2006-10-30 021 * @author 022 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 023 *********************************************************************/ 024 025 public final class ClientMain 026 implements Lifecycle 027 ////////////////////////////////////////////////////////////////////// 028 ////////////////////////////////////////////////////////////////////// 029 { 030 031 private final ClientConfig clientConfig; 032 033 private final ClientModel clientModel; 034 035 private final ClientNet clientNet; 036 037 private final ClientView clientView; 038 039 private final Looper looper; 040 041 private final Queue<ClientMessage> 042 modelQueue, 043 viewQueue; 044 045 private final BlockingQueue<ClientMessage> netQueue; 046 047 ////////////////////////////////////////////////////////////////////// 048 ////////////////////////////////////////////////////////////////////// 049 050 public static void main ( final String [ ] args ) 051 ////////////////////////////////////////////////////////////////////// 052 { 053 final ClientMain clientMain = new ClientMain ( args ); 054 055 final JFrame jFrame = new JFrame ( 056 clientMain.clientConfig.getFrameTitle ( ) ); 057 058 clientMain.setContentPane ( jFrame.getContentPane ( ) ); 059 060 // The Frame is the framework. 061 062 LifecycleWindowListener.launchFrameAsDesktopApp ( 063 jFrame, 064 clientMain, 065 clientMain.clientConfig.getFrameSize ( ), 066 clientMain.clientConfig.getShutdownConfirmationPrompt ( ) ); 067 } 068 069 ////////////////////////////////////////////////////////////////////// 070 ////////////////////////////////////////////////////////////////////// 071 072 public ClientMain ( final String [ ] args ) 073 ////////////////////////////////////////////////////////////////////// 074 { 075 clientConfig = ClientConfig.load ( args ); 076 077 System.out.println ( "\n" + clientConfig.getInfo ( ) ); 078 079 modelQueue = new LinkedList<ClientMessage> ( ); 080 081 viewQueue = new LinkedList<ClientMessage> ( ); 082 083 netQueue = new LinkedBlockingQueue<ClientMessage> ( ); 084 085 clientModel = new ClientModel ( modelQueue, viewQueue, netQueue ); 086 087 clientNet = new ClientNet ( clientConfig, netQueue, modelQueue ); 088 089 clientView = new ClientView ( clientConfig, viewQueue, modelQueue ); 090 091 final Updatable [ ] updatables = new Updatable [ ] { 092 clientModel, 093 clientView }; 094 095 looper = new Looper ( 096 new EventQueueUpdateLoop ( updatables ), // loopable 097 new NanoTimeLoopGovernor ( clientConfig.getUpdateRate ( ) ), 098 null, // exceptionHandler 099 clientConfig.getThreadName ( ), 100 Thread.MIN_PRIORITY, 101 true ); // useDaemonThread 102 } 103 104 ////////////////////////////////////////////////////////////////////// 105 ////////////////////////////////////////////////////////////////////// 106 107 public ClientConfig getClientConfig ( ) { return clientConfig; } 108 109 ////////////////////////////////////////////////////////////////////// 110 ////////////////////////////////////////////////////////////////////// 111 112 public void setContentPane ( final Container contentPane ) 113 ////////////////////////////////////////////////////////////////////// 114 { 115 clientView.setContentPane ( contentPane ); 116 } 117 118 ////////////////////////////////////////////////////////////////////// 119 // interface Lifecycle methods 120 ////////////////////////////////////////////////////////////////////// 121 122 public void init ( ) 123 ////////////////////////////////////////////////////////////////////// 124 { 125 LifecycleLib.init ( clientView, looper, clientNet ); 126 } 127 128 public void start ( ) 129 ////////////////////////////////////////////////////////////////////// 130 { 131 LifecycleLib.start ( clientView, looper, clientNet ); 132 } 133 134 public void stop ( ) 135 ////////////////////////////////////////////////////////////////////// 136 { 137 LifecycleLib.stop ( clientNet, clientView, looper ); 138 } 139 140 public void destroy ( ) 141 ////////////////////////////////////////////////////////////////////// 142 { 143 LifecycleLib.destroy ( clientNet, clientView, looper ); 144 } 145 146 ////////////////////////////////////////////////////////////////////// 147 ////////////////////////////////////////////////////////////////////// 148 }