import javax.swing.JFrame; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Vector; public class GridDisplay extends JPanel implements Runnable { /*@non_null@*/ private Grid grid; ///*@non_null@*/ private SimObjectChooser simobjchooser; private boolean stopThread; final static int SLEEP_DELAY = 200; GridDisplay (/*@non_null@*/ Grid grid/*,*/ /*@non_null@*/ /*SimObjectChooser simobjchooser*/) { this.grid = grid; //this.simobjchooser = simobjchooser; this.stopThread = true; setOpaque (false); // This is necessary to make painting work } private int getSquareWidth () //@ensures \result > 0 { int swidth = getWidth() / grid.numColumns (); if (swidth > 0) { return swidth; } else { return 1; } } private int getSquareHeight () //@ensures \result > 0 { int sheight = getHeight() / grid.numRows (); if (sheight > 0) { return sheight; } else { return 1; } } private int getHorizontalOffset () { return (getWidth() - (getSquareWidth () * grid.numColumns ())) / 2; } private int getVerticalOffset () { return (getHeight() - (getSquareHeight () * grid.numRows ())) / 2; } public void setObjectAt (int x, int y) { if (stopThread) { // Only allow grid locations to be set if // the simulation is stopped. int row = (y - getVerticalOffset ()) / getSquareHeight (); int col = (x - getHorizontalOffset ()) / getSquareWidth (); //grid.setObjectAt(row, col, simobjchooser.getSelectedClass()); repaint (); } } public void startObjects () { grid.startObjects (); // Start SimObject threads. Thread displayThread = new Thread(this); displayThread.start(); } public void run() { stopThread = false; while (!stopThread) { repaint (); try { Thread.sleep (SLEEP_DELAY); } catch (java.lang.InterruptedException e) { System.out.println("Display thread interrupted."); break; } } } public void pauseObjects () { grid.pauseObjects (); // Pause SimObject threads. this.stopThread = true; } public void paintComponent (Graphics g) throws RuntimeException { //@ assume g != null; int squarewidth = getSquareWidth (); int squareheight = getSquareHeight (); int hoffset = getHorizontalOffset (); int voffset = getVerticalOffset (); for (int row = 0; row < grid.numRows (); row++) { for (int col = 0; col < grid.numColumns (); col++) { SimObject tmp = grid.grabObjectAt (row,col); if (tmp == null) { g.setColor (Color.black); } else { g.setColor (tmp.getColor()); } g.fillRect (hoffset + col * squarewidth, voffset + row * squareheight, squarewidth - 1, squareheight - 1); } } } }