package fr.utc.leapband.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionAdapter; import java.util.Vector; import javax.swing.JCheckBox; import javax.swing.JPanel; import fr.utc.leapband.utilities.Constance; @SuppressWarnings({ "rawtypes", "serial" }) public class Piano extends JPanel implements MouseListener { Vector keys = new Vector(); Vector whiteKeys = new Vector(); Vector blackKeys = new Vector(); Key prevKey; final int kw = 90, kh = 400; final int ON = 0, OFF = 1; boolean record; final Color jfcBlue = new Color(204, 204, 255); final Color pink = new Color(255, 175, 175); final int NOTEON = 144; final int NOTEOFF = 128; JCheckBox mouseOverCB = new JCheckBox("mouseOver", true); @SuppressWarnings("unchecked") public Piano() { this.setBounds(20, (int)(Constance.Windows_height*0.4),14*kw, kh); setLayout(new BorderLayout()); int transpose = 24; int whiteIDs[] = { 0, 2, 4, 5, 7, 9, 11 }; for (int i = 0, x = 0; i < 3; i++) { for (int j = 0; j < 7; j++, x += kw) { int keyNum = i * 12 + whiteIDs[j] + transpose; whiteKeys.add(new Key(x, 0, kw, kh, keyNum)); } } for (int i = 0, x = 0; i < 3; i++, x += kw) { int keyNum = i * 12 + transpose; blackKeys.add(new Key((x += kw)-4, 0, kw/2, kh/2, keyNum+1)); blackKeys.add(new Key((x += kw)-4, 0, kw/2, kh/2, keyNum+3)); x += kw; blackKeys.add(new Key((x += kw)-4, 0, kw/2, kh/2, keyNum+6)); blackKeys.add(new Key((x += kw)-4, 0, kw/2, kh/2, keyNum+8)); blackKeys.add(new Key((x += kw)-4, 0, kw/2, kh/2, keyNum+10)); } keys.addAll(blackKeys); keys.addAll(whiteKeys); addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { if (mouseOverCB.isSelected()) { Key key = getKey(e.getPoint()); if (prevKey != null && prevKey != key) { prevKey.off(); } if (key != null && prevKey != key) { key.on(); } prevKey = key; repaint(); } } }); addMouseListener(this); } public void mousePressed(MouseEvent e) { prevKey = getKey(e.getPoint()); if (prevKey != null) { prevKey.on(); repaint(); } } public void mouseReleased(MouseEvent e) { if (prevKey != null) { prevKey.off(); repaint(); } } public void mouseExited(MouseEvent e) { if (prevKey != null) { prevKey.off(); repaint(); prevKey = null; } } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public Key getKey(Point point) { for (int i = 0; i < keys.size(); i++) { if (((Key) keys.get(i)).contains(point)) { return (Key) keys.get(i); } } return null; } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; Dimension d = getSize(); g2.setBackground(getBackground()); g2.clearRect(0, 0, d.width, d.height); g2.setColor(Color.white); g2.fillRect(0, 0, 14*kw, kh); for (int i = 0; i < whiteKeys.size(); i++) { Key key = (Key) whiteKeys.get(i); if (key.isNoteOn()) { g2.setColor(record ? pink : jfcBlue); g2.fill(key); } g2.setColor(Color.black); g2.draw(key); } for (int i = 0; i < blackKeys.size(); i++) { Key key = (Key) blackKeys.get(i); if (key.isNoteOn()) { g2.setColor(record ? pink : jfcBlue); g2.fill(key); g2.setColor(Color.black); g2.draw(key); } else { g2.setColor(Color.black); g2.fill(key); } } } /** * Black and white keys or notes on the piano. */ class Key extends Rectangle { int noteState = OFF; int kNum; public Key(int x, int y, int width, int height, int num) { super(x, y, width, height); kNum = num; } public boolean isNoteOn() { return noteState == ON; } public void on() { setNoteState(ON); } public void off() { setNoteState(OFF); } public void setNoteState(int state) { noteState = state; } } // End class Key } // End class Piano