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.Rectangle; 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.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; 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.connectToArduinos(); 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); JSplitPane bottomTopSplitPane = new JSplitPane( JSplitPane.VERTICAL_SPLIT); JSplitPane centerTopSplitPane = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT); JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab("LED Control Panel", null, new LEDControlPanel(), "Allows control of individual LED's"); centerTopSplitPane.setLeftComponent(new PunchingBagSim()); centerTopSplitPane.setRightComponent(tabbedPane); bottomTopSplitPane.setTopComponent(centerTopSplitPane); bottomTopSplitPane.setBottomComponent(new SerialPanel()); frame.add(bottomTopSplitPane, BorderLayout.CENTER); // frame.pack(); } class SerialPanel extends JPanel implements ActionListener, SerialReadListener, SerialWriteListener { JTextArea buttonIn = new JTextArea(); JTextArea buttonOut = new JTextArea(); JTextArea ledIn = new JTextArea(); JTextArea ledOut = new JTextArea(); public SerialPanel() { JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); JSplitPane buttonSplitPane = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT); JSplitPane ledSplitPane = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT); /* * splitPane.setOneTouchExpandable(true); * buttonSplitPane.setOneTouchExpandable(true); * ledSplitPane.setOneTouchExpandable(true); */ splitPane.setMinimumSize(new Dimension(200, 50)); buttonSplitPane.setMinimumSize(new Dimension(100, 50)); ledSplitPane.setMinimumSize(new Dimension(100, 50)); JButton clear = new JButton("Clear"); clear.addActionListener(this); JPanel buttonInPanel = new JPanel(); JScrollPane areaScrollPane = new JScrollPane(buttonIn); areaScrollPane .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); areaScrollPane.setPreferredSize(new Dimension(250, 100)); buttonInPanel.add(areaScrollPane, BorderLayout.CENTER); clear.setActionCommand("BI"); buttonInPanel.add(clear, BorderLayout.SOUTH); buttonInPanel.setBorder(BorderFactory .createTitledBorder("Serial In - Button Arduino")); buttonSplitPane.setLeftComponent(buttonInPanel); JPanel buttonOutPanel = new JPanel(); areaScrollPane = new JScrollPane(buttonOut); areaScrollPane .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); areaScrollPane.setPreferredSize(new Dimension(250, 100)); buttonOutPanel.add(areaScrollPane, BorderLayout.CENTER); clear = new JButton("Clear"); clear.setActionCommand("BO"); buttonOutPanel.add(clear, BorderLayout.SOUTH); buttonOutPanel.setBorder(BorderFactory .createTitledBorder("Serial Out - Button Arduino")); buttonSplitPane.setRightComponent(buttonOutPanel); JPanel ledInPanel = new JPanel(); areaScrollPane = new JScrollPane(ledIn); areaScrollPane .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); areaScrollPane.setPreferredSize(new Dimension(250, 100)); ledInPanel.add(areaScrollPane, BorderLayout.CENTER); clear = new JButton("Clear"); clear.setActionCommand("LI"); ledInPanel.add(clear, BorderLayout.SOUTH); ledInPanel.setBorder(BorderFactory .createTitledBorder("Serial In - LED Arduino")); ledSplitPane.setLeftComponent(ledInPanel); JPanel ledOutPanel = new JPanel(); areaScrollPane = new JScrollPane(ledOut); areaScrollPane .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); areaScrollPane.setPreferredSize(new Dimension(250, 100)); ledOutPanel.add(areaScrollPane, BorderLayout.CENTER); clear = new JButton("Clear"); clear.setActionCommand("LO"); ledOutPanel.add(clear, BorderLayout.SOUTH); ledOutPanel.setBorder(BorderFactory .createTitledBorder("Serial Out - LED Arduino")); ledSplitPane.setRightComponent(ledOutPanel); splitPane.setLeftComponent(buttonSplitPane); splitPane.setRightComponent(ledSplitPane); this.add(splitPane); bag.buttonArduino.addSerialReadListener(this); bag.buttonArduino.addSerialWriteListener(this); } @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub } @Override public void serialWriteEvent(byte b) { buttonOut.append(String.valueOf((char) b)); } @Override public void serialWriteEvent(byte[] b) { buttonOut.append(String.valueOf(b)); } @Override public void serialReadEvent(int b) { if (b != -1) buttonIn.append(String.valueOf((char) b)); } } 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(5, 5); } 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(20, 20); } public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.black); g.fillRect(0, 0, this.getWidth(), this.getHeight()); g.setColor(new Color(220, 220, 220)); g.fillRect(4, 4, this.getWidth() - 8, this.getHeight() - 8); } 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); bag.noise(new Rectangle(0, 0, 9, 20), 5000); } @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; } }