/** * Moobreeder is a simple cow breeding game to illustrate the principles of * selective breeding to KS3 pupils. * * (c) Daniel Vedder 2018, Amano Christian School * Licensed under the terms of the MIT license. * https://git.synoikos.de/daniel/moobreeder */ /* * This is the main class with the GUI. */ //TODO Set breeding goal at beginning of game (dairy, meat, plowing) import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class MooBreeder extends JFrame implements MouseListener { private JMenuBar menubar; private JMenu fileMenu, helpMenu; private JMenuItem save, load, reset, quit, help, about; private JPanel breedPanel; private JScrollPane herdScroller; private Box herdBox, motherBox, fatherBox, calf1Box, calf2Box; private JButton add, breed, keep, remove; private HelpWindow helpWindow; public static void main(String[] args) { Herd.getInstance(); MooBreeder mb = new MooBreeder(); } public MooBreeder() { this.setTitle("MooBreeder"); this.setSize(800, 400); this.setDefaultCloseOperation(EXIT_ON_CLOSE); helpWindow = new HelpWindow(); this.createMenu(); this.createLayout(); //TODO this.setVisible(true); } private void createMenu() { menubar = new JMenuBar(); fileMenu = new JMenu("File"); helpMenu = new JMenu("Help"); save = new JMenuItem("Save"); load = new JMenuItem("Load"); reset = new JMenuItem("Reset"); quit = new JMenuItem("Quit"); help = new JMenuItem("Help"); about = new JMenuItem("About"); //TODO save,load,help save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.ALT_MASK)); load.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.ALT_MASK)); reset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int restart = JOptionPane.showConfirmDialog(null, "Reset the game?", "Reset?", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (restart == JOptionPane.OK_OPTION) resetGame(); } }); reset.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.ALT_MASK)); help.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { helpWindow.setVisible(true); } }); help.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, ActionEvent.ALT_MASK)); quit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int confirm = JOptionPane.showConfirmDialog(null, "Quit MooBreeder?", "Quit?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if(confirm == JOptionPane.YES_OPTION) System.exit(0); } }); quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.ALT_MASK)); about.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "MooBreeder - an educational breeding game"+ "\n\n(c) 2018 Daniel Vedder"+ ", Amano Christian School"+ "\nhttps://git.synoikos.de/daniel/moobreeder", "About", JOptionPane.INFORMATION_MESSAGE); } }); fileMenu.add(save); fileMenu.add(load); fileMenu.add(reset); fileMenu.add(quit); helpMenu.add(help); helpMenu.add(about); menubar.add(fileMenu); menubar.add(helpMenu); this.setJMenuBar(menubar); } private void createLayout() { //TODO this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.X_AXIS)); //Create the left half of the window with the herd box JPanel herdBorderPanel = new JPanel(new BorderLayout()); JLabel herdlabel = new JLabel("Your current herd:", JLabel.CENTER); herdBorderPanel.add(herdlabel, BorderLayout.NORTH); herdBox = new Box(BoxLayout.Y_AXIS); herdScroller = new JScrollPane(herdBox, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); herdScroller.setWheelScrollingEnabled(true); herdBorderPanel.add(herdScroller, BorderLayout.CENTER); herdBorderPanel.add(Box.createVerticalStrut(25), BorderLayout.SOUTH); herdBorderPanel.add(Box.createHorizontalStrut(25), BorderLayout.EAST); herdBorderPanel.add(Box.createHorizontalStrut(25), BorderLayout.WEST); this.add(herdBorderPanel); //Create the right half of the window with the breeding interface breedPanel = new JPanel(new GridLayout(2,2)); fatherBox = new Box(BoxLayout.Y_AXIS); motherBox = new Box(BoxLayout.Y_AXIS); calf1Box = new Box(BoxLayout.Y_AXIS); calf2Box = new Box(BoxLayout.Y_AXIS); breedPanel.add(fatherBox); breedPanel.add(motherBox); breedPanel.add(calf1Box); breedPanel.add(calf2Box); this.add(breedPanel); updateGUI(); } private void updateGUI() { updateHerdBox(); updateParentBox(); updateOffspringBox(); this.repaint(); } private void updateHerdBox() { herdBox.removeAll(); for (int c = 0; c < Herd.getInstance().size(); c++) { Box cowBox = getCowBox(Herd.getInstance().getNthCow(c)); herdBox.add(cowBox); herdBox.add(Box.createVerticalStrut(1)); } herdBox.validate(); } private void updateParentBox() { fatherBox.removeAll(); motherBox.removeAll(); //Label boxes JLabel dl = new JLabel("Father:"); JLabel ml = new JLabel("Mother:"); fatherBox.add(dl); motherBox.add(ml); //Include information boxes Cow[] parents = Herd.getInstance().getParents(); if (parents[0] != null) { Box db = getCowBox(parents[0]); fatherBox.add(Box.createVerticalStrut(10)); fatherBox.add(db); } if (parents[1] != null) { Box mb = getCowBox(parents[1]); motherBox.add(Box.createVerticalStrut(10)); motherBox.add(mb); } fatherBox.validate(); motherBox.validate(); } private void updateOffspringBox() { calf1Box.removeAll(); calf2Box.removeAll(); JLabel l1 = new JLabel("Calf 1:"); JLabel l2 = new JLabel("Calf 2:"); calf1Box.add(l1); calf2Box.add(l2); //Include information boxes Cow[] calves = Herd.getInstance().getCalves(); if (calves[0] != null) { Box db = getCowBox(calves[0]); fatherBox.add(Box.createVerticalStrut(10)); fatherBox.add(db); } if (calves[1] != null) { Box mb = getCowBox(calves[1]); motherBox.add(Box.createVerticalStrut(10)); motherBox.add(mb); } calf1Box.validate(); calf2Box.validate(); } private void resetGame() { Herd.getInstance().resetHerd(); updateGUI(); } private Box getCowBox(Cow c) { Box cowBox = new Box(BoxLayout.Y_AXIS); cowBox.setName(String.valueOf(c.getID())); JLabel name = new JLabel(c.getName()); JLabel genealogy = new JLabel("Generation "+c.getGeneration()+ " Father "+c.getParents()[0]+ " Mother "+c.getParents()[1]); //TODO display cow traits and rating //cowBox.add(Box.createGlue()); cowBox.add(name); cowBox.add(Box.createVerticalStrut(3)); //cowBox.add(Box.createGlue()); cowBox.add(genealogy); //TODO insert remaining labels //cowBox.add(Box.createGlue()); cowBox.add(Box.createVerticalStrut(5)); cowBox.setBorder(new BevelBorder(BevelBorder.RAISED)); cowBox.addMouseListener(this); return cowBox; } /* * MouseListener methods */ @Override public void mouseClicked(MouseEvent me) { System.out.println("Recognised a mouse event."); //DEBUG int selectionID = Integer.parseInt(me.getComponent().getName()); //Respond to the mouse click with an action or a context menu if (me.getButton() == MouseEvent.BUTTON3) { mouseSideAction(selectionID, me); } else if (me.getButton() == MouseEvent.BUTTON1 && me.getClickCount() == 2) { mouseMainAction(selectionID); } updateGUI(); } /* * The action launched by a double left click or the first context menu: * set/remove a parent or add a calf to the herd. */ private void mouseMainAction(int selection) { System.out.println("Carrying out mouse main action on animal #"+selection); //DEBUG if (Herd.getInstance().isParent(selection)) Herd.getInstance().removeParent(selection); else if (Herd.getInstance().isCalf(selection)) Herd.getInstance().keepCalf(selection); else Herd.getInstance().setParent(selection); } /* * The context menu launched by a right click. Offers the main mouse action * (see above), or the option to discard/delete a calf or adult animal. */ private void mouseSideAction(int selection, MouseEvent me) { System.out.println("Carrying out mouse side action on animal #"+selection); //DEBUG //Initialise menu JPopupMenu contextMenu = new JPopupMenu(); JMenuItem item1 = new JMenuItem(); JMenuItem item2 = new JMenuItem(); //Change item labels and actions depending on context //FIXME Problem with animals occurring both in the herd list and the parent slots item1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mouseMainAction(selection); //always the same } }); if (Herd.getInstance().isParent(selection)) { item1.setText("Remove as parent"); } else if (Herd.getInstance().isCalf(selection)) { item1.setText("Add calf to herd"); item2.setText("Discard calf"); item2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Herd.getInstance().discardCalf(selection); } }); } else { item1.setText("Select for breeding"); item2.setText("Remove from herd"); item2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String question = "Remove "+Herd.getInstance(). getCow(selection).getName()+" from herd?"; int confirm = JOptionPane.showConfirmDialog(null, question, "Remove animal?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if(confirm == JOptionPane.YES_OPTION) Herd.getInstance().removeCow(selection); } }); } //Add menu items and show menu contextMenu.add(item1); if (item2.getText() != "") contextMenu.add(item2); contextMenu.show(me.getComponent(), me.getX(), me.getY()); } @Override public void mouseEntered(MouseEvent arg0) {} @Override public void mouseExited(MouseEvent arg0) {} @Override public void mousePressed(MouseEvent arg0) {} @Override public void mouseReleased(MouseEvent arg0) {} }