package com.lunivore.gameoflife.view.swing; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.WindowConstants; import com.lunivore.gameoflife.domain.Game; import com.lunivore.gameoflife.domain.GameObserver; import com.lunivore.gameoflife.domain.Grid; public class GameFrame extends JFrame implements GameObserver { private static final int HEIGHT = 20; private static final int WIDTH = 40; private static final int SCALE = 20; private static final long serialVersionUID = 1L; private final Game game; private JButton nextStep; private GameObserver delegateListener = GameObserver.NULL; public GameFrame(Game game) { this.game = game; setUpFrame(); setUpGrid(); createNextStepButton(); this.pack(); this.setVisible(true); } private void setUpFrame() { this.setName("game.frame"); this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); } private void setUpGrid() { this.getContentPane().setLayout(new BorderLayout()); ImageRenderer imageRenderer = new ImageRenderer(WIDTH, HEIGHT, SCALE); imageRenderer.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { int column = e.getX() / SCALE; int row = e.getY() / SCALE; game.toggleCellAt(column, row); } }); game.setObserver(imageRenderer); this.delegateListener = imageRenderer; this.getContentPane().add(imageRenderer, BorderLayout.CENTER); } private void createNextStepButton() { nextStep = new JButton("Next Step"); nextStep.setName("next.step"); nextStep.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { game.nextGeneration(); } }); this.add(nextStep, BorderLayout.SOUTH); } public void gridChanged(Grid grid) { delegateListener.gridChanged(grid); } public static void main(String[] args) { new GameFrame(new Game(40, 30)) ; } }