import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListCellRenderer; public class PunchingBagGUI implements MouseListener, MouseMotionListener, ButtonListener, LEDListener { public static enum Mode { Menu, Interactive, Game }; Mode currentMode = Mode.Interactive; static JFrame frame; // Contact public enum Direction { None, Up, Down, Left, Right }; static PunchingBag bag = new PunchingBag(); final boolean useDebugScreen = true; public static void main(String[] args) throws InterruptedException { new PunchingBagGUI(); } PunchingBagGUI() throws InterruptedException { bag.buttonArduino.listPorts(); frame = new JFrame("Punching Bag GUI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // frame.setSize(600, 600); frame.setVisible(true); frame.addMouseListener(this); frame.addMouseMotionListener(this); bag.addButtonListener(this); bag.addLEDChangeListener(this); frame.add(new PunchingBagSim(), BorderLayout.WEST); frame.add(new LEDControlPanel(), BorderLayout.CENTER); } class LEDControlPanel extends JPanel implements ActionListener { String[] colours = { " ", "R", "Y", "G" }; public LEDControlPanel() { this.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.anchor = GridBagConstraints.CENTER; // c.weightx = 0.2; // c.weighty = 0.2; for (int y = 0; y < bag.ledHeight; y++) { for (int x = 0; x < bag.ledWidth; x++) { c.gridx = x; c.gridy = y; RYGComboBoxRenderer renderer = new RYGComboBoxRenderer(); JComboBox rygCombo = new JComboBox(colours); rygCombo.setSelectedIndex(0); rygCombo.addActionListener(this); rygCombo.setActionCommand(String.valueOf(x) + "," + String.valueOf(y)); // rygCombo.setRenderer(renderer); this.add(rygCombo, c); } } c.gridx = 0; c.gridy = 20; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.CENTER; c.gridwidth = 9; JButton clear = new JButton("Clear"); clear.setActionCommand("C"); clear.addActionListener(this); this.add(clear, c); } public void actionPerformed(ActionEvent a) { if (a.getActionCommand() == "C") { bag.clearLEDs(); } else { PunchingBag.Colour colour = PunchingBag.Colour.None; if (((JComboBox) a.getSource()).getSelectedIndex() == 1) { colour = PunchingBag.Colour.Red; } else if (((JComboBox) a.getSource()).getSelectedIndex() == 2) { colour = PunchingBag.Colour.Yellow; } else if (((JComboBox) a.getSource()).getSelectedIndex() == 3) { colour = PunchingBag.Colour.Green; } System.out.println("Setting " + a.getActionCommand().split(",")[0] + " " + a.getActionCommand().split(",")[1]); bag.setLED(Integer.valueOf(a.getActionCommand().split(",")[0]), Integer.valueOf(a.getActionCommand().split(",")[1]), colour); } } class RYGComboBoxRenderer extends JLabel implements ListCellRenderer { public RYGComboBoxRenderer() { super(); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { // Get the selected index. (The index param isn't // always valid, so just use the value.) if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } if (index != -1) setText(colours[index]); return this; } } } class PunchingBagSim extends JPanel implements ButtonListener, LEDListener, MouseListener { int buttonMinSize = 10; int buttonMaxSize = 50; int ledMinSize = 10; int ledMaxSize = 50; int buttonSize = 40; int ledSize = 8; public PunchingBagSim() { /* * this.setMinimumSize(new Dimension((bag.buttonWidth * * buttonMinSize) + (bag.ledWidth * ledMinSize), (bag.buttonHeight * * buttonMinSize) + (bag.ledHeight * ledMaxSize))); * this.setMaximumSize(new Dimension((bag.buttonWidth * * buttonMaxSize) + (bag.ledWidth * ledMaxSize), (bag.buttonHeight * * buttonMaxSize) + (bag.ledHeight * ledMaxSize))); */ bag.addButtonListener(this); bag.addLEDChangeListener(this); this.addMouseListener(this); GridBagLayout gbl = new GridBagLayout(); this.setLayout(gbl); GridBagConstraints c = new GridBagConstraints(); // c.insets = new Insets(1, 1, 1, 1); c.fill = GridBagConstraints.BOTH; c.anchor = GridBagConstraints.CENTER; // c.weightx = 0.2; // c.weighty = 0.2; for (int y = 0; y < bag.ledHeight; y++) { for (int x = 0; x < bag.ledWidth; x++) { c.gridx = x * 2; c.gridy = y * 2; this.add(new LED(x, y), c); } } // c.weightx = 0.8; // c.weighty = 0.8; for (int y = 0; y < bag.buttonHeight; y++) { for (int x = 0; x < bag.buttonWidth; x++) { c.gridx = (x * 2) + 1; c.gridy = (y * 2) + 1; this.add(new Button(x, y), c); } } // this.setMinimumSize(new Dimension(500,500)); // this.setPreferredSize(new Dimension(500,500)); // this.setBackground(Color.BLUE); frame.pack(); frame.setSize(500, 500); this.setBorder(BorderFactory.createLineBorder(Color.black)); } /* * public Dimension getPreferredSize() { if () return new * Dimension(super.,10); } */ class LED extends JComponent implements LEDListener { final int x; final int y; public LED(int x, int y) { this.x = x; this.y = y; /* * this.setMinimumSize(new Dimension(50,50)); this.setSize(50, * 50); this.setPreferredSize(new Dimension(50,50)); */ bag.addLEDChangeListener(this); } public Dimension getPreferredSize() { return new Dimension(10, 10); } public void paintComponent(Graphics g) { if (bag.getLED(x, y) == PunchingBag.Colour.Red) { g.setColor(Color.red); } else if (bag.getLED(x, y) == PunchingBag.Colour.Green) { g.setColor(Color.green); } else if (bag.getLED(x, y) == PunchingBag.Colour.Yellow) { g.setColor(Color.yellow); } else { g.setColor(Color.white); } g.fillOval(0, 0, this.getWidth(), this.getHeight()); } @Override public void LEDchanged() { this.repaint(); } } class Button extends JComponent implements MouseListener { final int x; final int y; public Button(int x, int y) { this.x = x; this.y = y; setBorder(BorderFactory.createLineBorder(Color.black)); this.addMouseListener(this); } public Dimension getPreferredSize() { return new Dimension(30, 30); } public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.black); g.fill3DRect(0, 0, this.getWidth(), this.getHeight(), true); } public void mouseClicked(MouseEvent arg0) { } public void mouseEntered(MouseEvent arg0) { } public void mouseExited(MouseEvent arg0) { } public void mousePressed(MouseEvent arg0) { System.out.println("Button Pressed"); bag.buttonPressed(x, y); } public void mouseReleased(MouseEvent arg0) { } } public void buttonPressed(int x, int y) { this.repaint(); } public void LEDchanged() { this.repaint(); } @Override public void mouseClicked(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent me) { if (currentMode == Mode.Interactive) { // bag.buttonPressed(me.getX()/(buttonSize+ledSize), // me.getY()/(buttonSize+ledSize)); } } @Override public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub } } public void runInteractively(Contact contact) { System.out.println("Contact"); bag.buttonPressed(contact.x, contact.y); } public void mouseClicked(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } public void mousePressed(MouseEvent arg0) { /* * if (currentMode == Mode.Interactive) { runInteractively(new * Contact(System.currentTimeMillis(), (arg0 .getX() - 4) / 40, * (arg0.getY() - 30) / 40, 0)); } */ } public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseDragged(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseMoved(MouseEvent arg0) { // TODO Auto-generated method stub } public void contact(Contact c) { // TODO Auto-generated method stub } @Override public void buttonPressed(int x, int y) { System.out.println("Button Pressed: " + x + " " + y); bag.circleExpand(x, y, 16); } @Override public void LEDchanged() { /* * for (int x = 0; x < bag.ledWidth; x++) { for (int y = 0; y < * bag.ledHeight; y++) { if (useDebugScreen) { Graphics g = * bagSimFrame.getGraphics(); if (bag.getLED(x, y) == * PunchingBag.Colour.Red) { g.setColor(Color.red); g.fillOval(40 * x, * 40 * y, 6, 6); } else if (bag.getLED(x, y) == * PunchingBag.Colour.Green) { g.setColor(Color.green); g.fillOval(40 * * x, 40 * y, 6, 6); } else if (bag.getLED(x, y) == * PunchingBag.Colour.Yellow) { g.setColor(Color.yellow); g.fillOval(40 * * x, 40 * y, 6, 6); } else { g.setColor(Color.white); g.fillOval(40 * * x, 40 * y, 6, 6); } } } } */ } static PunchingBag getPunchingBag() { return bag; } }