package solarsim.renderer; import solarsim.*; import solarsim.common.State; import java.awt.*; import java.io.FileInputStream; import java.io.InputStream; import java.util.*; import javax.swing.*; public class Renderer2D extends JFrame implements Runnable { private final MyCanvas canvas; private final LinkedList states; private volatile boolean running; private Thread thread; static int count=0; public Renderer2D() { super("Solar Sim"); this.canvas = new MyCanvas(); this.states = new LinkedList(); this.setLayout(new BorderLayout()); this.add(canvas); this.pack(); this.setVisible(true); } public void drawState(State s) { if( count++ % RenderConstants.DRAW_EVERY != 0 ) return; if( s == null ) return; synchronized( states ) { states.addFirst(s); states.notify(); } } @Override public void run() { this.running = true; this.thread = Thread.currentThread(); while( running ) { synchronized( states ) { while( states.isEmpty() ) { try { states.wait(); } catch (InterruptedException ex) { } } State s = states.removeLast(); canvas.drawState(s); } try { thread.sleep(40); } catch( Exception ex ) {} } } public void stop() { this.running = false; this.thread.interrupt(); // close JFrame this.setVisible(false); this.dispose(); } /** * @param args the command line arguments */ public static void main(String[] args) { try { Renderer2D renderer = new Renderer2D(); new Thread(renderer).start(); /* ServerSocket ss = new ServerSocket(2200); Socket sock = ss.accept(); InputStream is = sock.getInputStream(); */ InputStream is = new FileInputStream("sim.dat"); while(true) { State s = State.readStateFromInputStream(is); if( s == null ) break; renderer.drawState(s); } System.out.println("Stopping."); Thread.currentThread().sleep(1000 * 60); renderer.stop(); // sock.close(); } catch(Exception e) { e.printStackTrace(); } } }