package class9_Lab_MapperPersonWriter; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.util.Deque; import java.util.LinkedList; public class Mapper extends JFrame { private final JLabel pictureLabel; private Person person; private Deque undoStack = new LinkedList<>(); public static void main(String[] args) { new Mapper(); } public Mapper() { setSize(500, 400); setDefaultCloseOperation(EXIT_ON_CLOSE); setLayout(new FlowLayout()); ImageIcon image = new ImageIcon(getClass().getResource("map.png")); pictureLabel = new JLabel(image); add(pictureLabel); // Note: We won't use a layout since we want to manually position the people. JPanel innerPanel = new JPanel(); innerPanel.setLayout(new GridLayout(3, 3)); pictureLabel.add(innerPanel); innerPanel.setLocation(10, 10); innerPanel.add(new JPanel()); // empty spot JButton upButton = new JButton("^"); upButton.setActionCommand("up"); upButton.addActionListener(e->handle(e)); innerPanel.add(upButton); innerPanel.add(new JPanel()); // empty spot JButton leftButton = new JButton("<"); leftButton.setActionCommand("left"); leftButton.addActionListener(e->handle(e)); innerPanel.add(leftButton); JButton undoButton = new JButton("U"); undoButton.setActionCommand("undo"); undoButton.addActionListener(e->handle(e)); innerPanel.add(undoButton); JButton rightButton = new JButton(">"); rightButton.setActionCommand("right"); rightButton.addActionListener(e->handle(e)); innerPanel.add(rightButton); innerPanel.add(new JPanel()); // empty spot JButton downButton = new JButton("v"); downButton.setActionCommand("down"); downButton.addActionListener(e->handle(e)); innerPanel.add(downButton); innerPanel.add(new JPanel()); // empty spot generatePerson(); pack(); innerPanel.setSize(innerPanel.getPreferredSize()); setVisible(true); } private void handle(ActionEvent e) { if("up".equals(e.getActionCommand())) { person.moveBy(0,-10); } else if("down".equals(e.getActionCommand())) { person.moveBy(0, 10); } else if("left".equals(e.getActionCommand())) { person.moveBy(-10,0); } else if("right".equals(e.getActionCommand())) { person.moveBy(10,0); } else if("undo".equals(e.getActionCommand())) { /* do nothing -- yet */ } else { System.err.println("Warning: Unrecognized command: "+e.getActionCommand()); } if(!"undo".equals(e.getActionCommand())) { undoStack.addLast(e.getActionCommand()); } else { // undo String command = undoStack.pollLast(); if(command == null) { System.err.println("Warning: Could not undo. Empty undo stack"); } else if("up".equals(command)) { person.moveBy(0,10); } else if("down".equals(command)) { person.moveBy(0, -10); } else if("left".equals(command)) { person.moveBy(10,0); } else if("right".equals(command)) { person.moveBy(-10, 0); } else { System.err.println("Warning: Could not undo. Unrecognized command: "+e.getActionCommand()); } } } private void generatePerson() { person = new Person(); person.jump(pictureLabel.getPreferredSize().width, pictureLabel.getPreferredSize().height); pictureLabel.add(person.getDisplayOfMe()); repaint(); } }