package org.myrobotlab.control.widget; import java.awt.Color; 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.KeyEvent; import java.awt.event.KeyListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JPanel; public class DirectionWidget extends JPanel implements KeyListener { public class ButtonActionListener implements ActionListener { ActionListener chainedListener; @Override public void actionPerformed(ActionEvent ae) { // nJButton button = (JButton)ae.getSource(); if (chainedListener != null) { chainedListener.actionPerformed(ae); } } public void setActionListener(ActionListener al) { chainedListener = al; } /* * TODO - replaceListener public ComponentListener[] getListeners() { return * getComponentListeners(); } */ } ButtonActionListener bal = new ButtonActionListener(); public JButton btnNw; public JButton btnN; public JButton btnNe; public JButton btnE; public JButton btnSe; public JButton btnS; public JButton btnSw; public JButton btnW; public JButton btnStop; // TODO - Spin CW Spin CCW // TODO - config - 4 dir 8 dir - spin (other -> globe) // TODO - forward driving turn left spin left - differential drive // TODO - configurable key mapping private static final long serialVersionUID = 1L; public DirectionWidget() { // setForeground(Color.GREEN); /* * BevelBorder widgetTitle; widgetTitle = (BevelBorder) * BorderFactory.createBevelBorder(BevelBorder.RAISED); * this.setBorder(widgetTitle); TitledBorder title; title = * BorderFactory.createTitledBorder("direction"); this.setBorder(title); */ GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[] { 0, 0, 0, 0 }; gridBagLayout.rowHeights = new int[] { 0, 0, 0, 0, 0 }; gridBagLayout.columnWeights = new double[] { 0.0, 0.0, 0.0, Double.MIN_VALUE }; gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE }; setLayout(gridBagLayout); btnNw = new JButton(""); btnNw.setBackground(new Color(173, 255, 47)); btnNw.setIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_up_left_grey.png"))); btnNw.setPressedIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_up_left_green.png"))); btnNw.addActionListener(bal); GridBagConstraints gbc_btnNw = new GridBagConstraints(); gbc_btnNw.insets = new Insets(0, 0, 0, 0); gbc_btnNw.gridx = 0; gbc_btnNw.gridy = 0; add(btnNw, gbc_btnNw); btnNw.addKeyListener(this); btnNw.setActionCommand("nw"); btnNw.setVisible(false); btnN = new JButton(""); btnN.setBackground(new Color(173, 255, 47)); btnN.setIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_up_grey.png"))); btnN.setPressedIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_up_green.png"))); btnN.addActionListener(bal); GridBagConstraints gbc_btnN = new GridBagConstraints(); gbc_btnN.insets = new Insets(0, 0, 0, 0); gbc_btnN.gridx = 1; gbc_btnN.gridy = 0; add(btnN, gbc_btnN); btnN.addKeyListener(this); btnN.setActionCommand("n"); btnNe = new JButton(""); btnNe.setBackground(new Color(173, 255, 47)); btnNe.setIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_up_right_grey.png"))); btnNe.setPressedIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_up_right_green.png"))); btnNe.addActionListener(bal); GridBagConstraints gbc_btnNe = new GridBagConstraints(); gbc_btnNe.insets = new Insets(0, 0, 0, 0); gbc_btnNe.gridx = 2; gbc_btnNe.gridy = 0; add(btnNe, gbc_btnNe); btnNe.addKeyListener(this); btnNe.setActionCommand("listener"); btnNe.setVisible(false); btnW = new JButton(""); btnW.setBackground(new Color(173, 255, 47)); btnW.setIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_left_grey.png"))); btnW.setPressedIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_left_green.png"))); btnW.addActionListener(bal); GridBagConstraints gbc_btnW = new GridBagConstraints(); gbc_btnW.insets = new Insets(0, 0, 0, 0); gbc_btnW.gridx = 0; gbc_btnW.gridy = 1; add(btnW, gbc_btnW); btnW.addKeyListener(this); btnW.setActionCommand("w"); btnStop = new JButton(""); btnStop.setIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/bullet_square_grey.png"))); btnStop.setPressedIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/bullet_square_green.png"))); btnStop.setBackground(new Color(173, 255, 47)); btnStop.addActionListener(bal); GridBagConstraints gbc_btnSt = new GridBagConstraints(); gbc_btnSt.insets = new Insets(0, 0, 0, 0); gbc_btnSt.gridx = 1; gbc_btnSt.gridy = 1; add(btnStop, gbc_btnSt); btnStop.addKeyListener(this); btnStop.setActionCommand("stop"); btnE = new JButton(""); btnE.setBackground(new Color(173, 255, 47)); btnE.setIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_right_grey.png"))); btnE.setPressedIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_right_green.png"))); btnE.addActionListener(bal); GridBagConstraints gbc_btnE = new GridBagConstraints(); gbc_btnE.insets = new Insets(0, 0, 0, 0); gbc_btnE.gridx = 2; gbc_btnE.gridy = 1; add(btnE, gbc_btnE); btnE.addKeyListener(this); btnE.setActionCommand("e"); btnSw = new JButton(""); btnSw.setBackground(new Color(173, 255, 47)); btnSw.setIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_down_left_grey.png"))); btnSw.setPressedIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_down_left_green.png"))); btnSw.addActionListener(bal); GridBagConstraints gbc_btnSw = new GridBagConstraints(); gbc_btnSw.insets = new Insets(0, 0, 0, 0); gbc_btnSw.gridx = 0; gbc_btnSw.gridy = 2; add(btnSw, gbc_btnSw); btnSw.addKeyListener(this); btnSw.setActionCommand("sw"); btnSw.setVisible(false); btnS = new JButton(""); btnS.setBackground(new Color(173, 255, 47)); btnS.setIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_down_grey.png"))); btnS.setPressedIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_down_green.png"))); btnS.addActionListener(bal); GridBagConstraints gbc_btnS = new GridBagConstraints(); gbc_btnS.insets = new Insets(0, 0, 0, 0); gbc_btnS.gridx = 1; gbc_btnS.gridy = 2; add(btnS, gbc_btnS); btnS.addKeyListener(this); btnS.setActionCommand("s"); btnSe = new JButton(""); btnSe.setBackground(new Color(173, 255, 47)); btnSe.setIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_down_right_grey.png"))); btnSe.setPressedIcon(new ImageIcon(DirectionWidget.class.getResource("/resource/arrow_down_right_green.png"))); btnSe.addActionListener(bal); GridBagConstraints gbc_btnSe = new GridBagConstraints(); gbc_btnSe.insets = new Insets(0, 0, 0, 0); gbc_btnSe.gridx = 2; gbc_btnSe.gridy = 2; add(btnSe, gbc_btnSe); btnSe.addKeyListener(this); btnSe.setActionCommand("se"); btnSe.setVisible(false); /* * JToggleButton tglbtnT = new JToggleButton("use keyboard"); * tglbtnT.setBackground(new Color(173, 255, 47)); GridBagConstraints * gbc_tglbtnT = new GridBagConstraints(); gbc_tglbtnT.gridwidth = 2; * gbc_tglbtnT.insets = new Insets(0, 0, 0, 0); gbc_tglbtnT.gridx = 0; * gbc_tglbtnT.gridy = 3; add(tglbtnT, gbc_tglbtnT); */ // this.addKeyListener(this); // } @Override public void keyPressed(KeyEvent keyEvent) { int code = keyEvent.getKeyCode(); if (code == KeyEvent.VK_Q) { btnNw.doClick(); } else if (code == KeyEvent.VK_UP || code == KeyEvent.VK_W) { btnN.doClick(); } else if (code == KeyEvent.VK_E) { btnNe.doClick(); } else if (code == KeyEvent.VK_RIGHT || code == KeyEvent.VK_D) { btnE.doClick(); } else if (code == KeyEvent.VK_C) { btnSe.doClick(); } else if (code == KeyEvent.VK_DOWN || code == KeyEvent.VK_X) { btnS.doClick(); } else if (code == KeyEvent.VK_Z) { btnSw.doClick(); } else if (code == KeyEvent.VK_LEFT || code == KeyEvent.VK_A) { btnW.doClick(); } else if (code == KeyEvent.VK_SPACE || code == KeyEvent.VK_S) { btnStop.doClick(); } } @Override public void keyReleased(KeyEvent arg0) { // btnN.doClick(); } @Override public void keyTyped(KeyEvent arg0) { // btnN.doClick(); } public void setDirectionListener(ActionListener a) { bal.setActionListener(a); } /* * public void replaceListener(ActionListener al) { ComponentListener[] b = * bal.getListeners(); for (int i = 0; i < b.length; ++i) { b[i]. } } */ }