import javax.swing.JPanel; import java.awt.*; /** * Clase generadora de un panel en el cual se muestra el dibujo de un teclado * del sintetizador. En cada tecla tiene dibujado tambien una letra para mostrar * al usuario, que tecla del teclado del PC debe presionar para generar una * determinada nota en el sintetizador. Mediante una variable de control se * puede seleccionar si se dibuja un punto sobre una de las teclas. * @author Daniel Acevedo, Francisco Barros. * @version v1.0 */ public class Keyboard extends JPanel { private int puntoX; private int puntoY; private boolean ctlPunto = false; private boolean ctlBlanca = true; private int tecla; private String keys="ZSXDCVGBHNJM,L.Ñ-Q2W3E4RT6Y7UI9O0P=[]"; private String wKeys="ZXCVBNM,.-QWERTYUIOP["; private String bKeys="SDGHJLÑ2346790="; /** * Metodo sobrcargado para realizar el dibujo. * @param g Componente en el cual se dibuja. */ @Override protected void paintComponent( Graphics g ) { g.setColor(Color.black); g.fillRect(0, 0, 750, 600); // Pintado de teclas blancas: g.setColor(Color.white); for (int n = 0; n < 21; n++) g.fillRect( 5 + (n * 35), 2, 33, 130); // Pintado de teclas negras: g.setColor(Color.black); for (int n = 0; n < 21; n++) { switch (n) { case 0: case 1: case 3: case 4: case 5: case 7: case 8: case 10: case 11: case 12: case 14: case 15: case 17: case 18: case 19: g.fillRect( 26 + (n * 35), 2, 23, 80); break; } } // Pintado de letras g.setFont(new Font("Verdana", Font.BOLD, 10)); for (int n = 0, whiteIndex = 0; n < 36; n++) { int thisChar=keys.charAt(n); switch (thisChar) { // Pintado de letras en teclas negras. case 'Z': case 'X': case 'C': case 'V': case 'B': case 'N': case 'M': case ',': case '.': case '-': case 'Q': case 'W': case 'E': case 'R': case 'T': case 'Y': case 'U': case 'I': case 'O': case 'P': case '[': g.setColor(Color.BLACK); g.drawString(keys.substring(n, n + 1), 17 + (whiteIndex * 35), 120); whiteIndex++; break; // Pintado de letras en teclas blancas. case 'S': case 'D': case 'G': case 'H': case 'J': case 'L': case 'Ñ': case '2': case '3': case '4': case '6': case '7': case '9': case '0': case '=': g.setColor(Color.white); g.drawString(keys.substring(n, n + 1), 33 + ((whiteIndex - 1) * 35), 75); break; } } // Dependiendo del valor de ctlPunto se pinta o no un punto sobre // una tecla if(ctlPunto) { int n=-1; ctlBlanca = true; switch (tecla) { // teclas blancas case 'Z': puntoX = 17; break; case 'X': puntoX = 52; break; case 'C': puntoX = 87; break; case 'V': puntoX = 122; break; case 'B': puntoX = 157; break; case 'N': puntoX = 192; break; case 'M': puntoX = 227; break; case ',': puntoX = 262; break; case '.': puntoX = 297; break; case '-': puntoX = 332; break; case 'Q': puntoX = 367; break; case 'W': puntoX = 402; break; case 'E': puntoX = 437; break; case 'R': puntoX = 472; break; case 'T': puntoX = 507; break; case 'Y': puntoX = 542; break; case 'U': puntoX = 577; break; case 'I': puntoX = 612; break; case 'O': puntoX = 647; break; case 'P': puntoX = 682; break; case '[': puntoX = 717; break; default: ctlBlanca=false; break; } // Si la nota corresponde a una tecla blanca se pinta mediante el // siguiente código: if(ctlBlanca) { puntoY = 105; g.setColor(Color.BLACK); g.fillOval(puntoX-6,puntoY, 20, 20); n = (int)((puntoX-17)/35); g.setColor(Color.WHITE); g.drawString(wKeys.substring(n, n + 1), puntoX, 120); } switch (tecla) { // teclas negras case 'S': puntoX = 32; n = 0; break; case 'D': puntoX = 67; n = 1; break; case 'G': puntoX = 137; n = 2; break; case 'H': puntoX = 172; n = 3; break; case 'J': puntoX = 207; n = 4; break; case 'L': puntoX = 277; n = 5; break; case 'Ñ': puntoX = 312; n = 6; break; case '2': puntoX = 382; n = 7; break; case '3': puntoX = 417; n = 8; break; case '4': puntoX = 452; n = 9; break; case '6': puntoX = 522; n = 10; break; case '7': puntoX = 557; n = 11; break; case '9': puntoX = 627; n = 12; break; case '0': puntoX = 662; n = 13; break; case '=': puntoX = 697; n = 14; break; } // Si la nota corresponde a una tecla negra se pinta mediante el // siguiente código: if(!ctlBlanca) { puntoY = 60; g.setColor(Color.WHITE); g.fillOval(puntoX-5,puntoY, 20, 20); g.setColor(Color.BLACK); g.drawString(bKeys.substring(n, n + 1), puntoX, 75); } } } /** * Metodo que dibuja el punto sobre una tecla. Se cambia la variable de * control a verdadera y luego se repinta. * @param c Tecla en la cual el punto se dibujará */ public void pintaPunto(int c) { tecla = c; ctlPunto = true; repaint(); } /** * Metodo que borra un punto dibujado anteriormente. Se cambia a falsa la * variable de control y se repinta. */ public void borraPunto() { ctlPunto = false; repaint(); } }