📄 piano.java
字号:
package piano;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.URL;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class Piano
extends Applet
implements MouseListener, KeyListener {
//键盘、鼠标释放时显示的键盘图片
Image m_ImgUp;
//键盘、鼠标按下时显示的键盘图片
Image m_ImgDown;
final int IMG_WIDTH = 17;
final int IMG_HEIGHT = 85;
int[] m_nState = new int[14];
final int STATE_UP = 0;
final int STATE_DOWN = 1;
AudioClip[] m_AudioClip = new AudioClip[14];
int m_nOldDownCount = -1;
//Construct the applet
public Piano() {
}
//Initialize the applet
public void init() {
try {
jbInit();
for (int i = 0; i < 14; i++) {
m_nState[i] = STATE_UP;
}
m_nState[10] = STATE_DOWN;
//将第11个琴键初始化为按下的状态的。
try {
URL url = Class.forName("piano.Piano").getResource("img/up.gif");
m_ImgUp = getToolkit().getImage(url);
url = Class.forName("piano.Piano").getResource("img/down.gif");
m_ImgDown = getToolkit().getImage(url);
}
catch (Exception e) {
e.printStackTrace();
}
MediaTracker mediaTracker = new MediaTracker(this);
mediaTracker.addImage(m_ImgUp, 0);
//将m_ImgUp加入到监视队列中,标识号为0
mediaTracker.addImage(m_ImgDown, 1);
//将m_ImgDown加入到监视队列中,标识号为1
try {
mediaTracker.waitForID(0);
}
catch (Exception e) {
System.out.println("m_ImgUp is not loaded right");
}
try {
mediaTracker.waitForID(1);
}
catch (Exception e) {
System.out.println("m_ImgDown is not loaded right");
}
for (int i = 0; i < 14; i++) {
try {
URL url = Class.forName("piano.Piano").getResource("au/" + i + ".au");
m_AudioClip[i] = getAudioClip(url);
}
catch (Exception e) {
e.printStackTrace();
}
}
//监听键盘消息
addKeyListener(this);
//监听鼠标消息
addMouseListener(this);
}
catch (Exception e) {
e.printStackTrace();
}
}
//Component initialization
private void jbInit() throws Exception {
this.addMouseMotionListener(new Piano_this_mouseMotionAdapter(this));
}
public void paint(Graphics g) {
for (int i = 0; i < 14; i++) {
switch (m_nState[i]) {
case 0:
g.drawImage(m_ImgUp, i * IMG_WIDTH, 0, this);
break;
case 1:
g.drawImage(m_ImgDown, i * IMG_WIDTH, 0, this);
break;
}
}
}
void showSound(int nCount) {
m_AudioClip[nCount].play();
}
public void mouseClicked(MouseEvent e) {
//Invoked when the mouse has been clicked on a component.
int nMouseCount = e.getClickCount();
//System.out.println("你触发了"+nMouseCount+"击事件");
}
public void mouseEntered(MouseEvent e) {
//Invoked when the mouse enters a component.
}
public void mouseExited(MouseEvent e) {
//Invoked when the mouse exits a component.
if (m_nOldDownCount != -1) {
m_nState[m_nOldDownCount] = STATE_UP;
}
m_nOldDownCount = -1;
}
public void mousePressed(MouseEvent e) {
//Invoked when a mouse button has been pressed on a component.
//System.out.println("你的鼠标已被按下");
int nX = e.getX();
int nY = e.getY();
// System.out.println("你的鼠标时在坐标:"+nX+","+nY+"处按下");
// System.out.println(nX);
int nCount = nX / IMG_WIDTH;
m_nState[nCount] = STATE_DOWN;
showSound(nCount);
m_nOldDownCount = nCount;//获得按下的琴键的序号,并存到nCount变量里。
Graphics g = getGraphics();
//g.fillRect(nCount*IMG_WIDTH,0,IMG_WIDTH,IMG_HEIGHT);
g.drawImage(m_ImgDown, nCount * IMG_WIDTH, 0, this);
//repaint();
}
public void mouseReleased(MouseEvent e) {
//Invoked when a mouse button has been released on a component.
//System.out.println("你的鼠标已被松开");
int nX = e.getX();
int nY = e.getY();
//System.out.println("你的鼠标时在坐标:" + nX + "," + nY + "处松开");
int nCount = nX / IMG_WIDTH;
m_nState[nCount] = STATE_UP;
m_nOldDownCount = -1;
Graphics g = getGraphics();//获得鼠标释放时所对应的琴键的序号,并存到nCount变量里。
g.drawImage(m_ImgUp, nCount * IMG_WIDTH, 0, this);
//repaint();
}
public void keyPressed(KeyEvent e) {
//System.out.println("你的键盘已经按下");
int nKeyCode = e.getKeyCode();
//System.out.println("现在按下的键值是"+nKeyCode);
String sKeyName = e.getKeyText(nKeyCode);
// System.out.println("现在按下的键名是"+sKeyName);
// System.out.println("KeyEvent的VK_8常量是"+KeyEvent.VK_8);
boolean bControlDown = e.isControlDown();
// if(bControlDown)System.out.println("Ctrl键按下");
// else System.out.println("Ctrl键没有被按下");
int nCount = -1;
switch (nKeyCode) {
case KeyEvent.VK_1:
nCount = 0;
break;
case KeyEvent.VK_2:
nCount = 1;
break;
case KeyEvent.VK_3:
nCount = 2;
break;
case KeyEvent.VK_4:
nCount = 3;
break;
case KeyEvent.VK_5:
nCount = 4;
break;
case KeyEvent.VK_6:
nCount = 5;
break;
case KeyEvent.VK_7:
nCount = 6;
break;
default:
return;
}
if (bControlDown) {
nCount = nCount + 7;
}
setPianoKeyDown(nCount);
showSound(nCount);
Graphics g = getGraphics();
g.drawImage(m_ImgDown, nCount * IMG_WIDTH, 0, this);
// repaint();
//Invoked when a key has been pressed.
}
public void keyReleased(KeyEvent e) {
//Invoked when a key has been released.
System.out.println("你的键盘已经松开");
int nKeyCode = e.getKeyCode();
// System.out.println("现在松开的键值是"+nKeyCode);
String sKeyName = e.getKeyText(nKeyCode);
// System.out.println("现在松开的键名是"+sKeyName);
// System.out.println("KeyEvent的VK_8常量是"+KeyEvent.VK_8);
boolean bControlDown = e.isControlDown();
int nCount = -1;
switch (nKeyCode) {
case KeyEvent.VK_1:
nCount = 0;
break;
case KeyEvent.VK_2:
nCount = 1;
break;
case KeyEvent.VK_3:
nCount = 2;
break;
case KeyEvent.VK_4:
nCount = 3;
break;
case KeyEvent.VK_5:
nCount = 4;
break;
case KeyEvent.VK_6:
nCount = 5;
break;
case KeyEvent.VK_7:
nCount = 6;
break;
default:
return;
}
if (bControlDown) {
nCount = nCount + 7;
}
m_nState[nCount] = STATE_UP;
Graphics g = getGraphics();
g.drawImage(m_ImgUp, nCount * IMG_WIDTH, 0, this);
// repaint();
}
private void setAllPianoKeyUp() {
for (int i = 0; i < 14; i++) {
m_nState[i] = STATE_UP;
}
}
void setPianoKeyDown(int nCount) {
for (int i = 0; i < 14; i++) {
m_nState[i] = STATE_UP;
}
m_nState[nCount] = STATE_DOWN;
}
public void keyTyped(KeyEvent e) {
//System.out.print("你的键盘已经按下");
int nKeyCode = e.getKeyChar();
System.out.println("现在按下的键值是"+nKeyCode);
String sKeyName = e.getKeyText(nKeyCode);
// System.out.println("现在按下的键名是"+sKeyName);
// System.out.println("KeyEvent的VK_8常量是"+KeyEvent.VK_8);
boolean bControlDown = e.isControlDown();
// if(bControlDown)System.out.println("Ctrl键按下");
// else System.out.println("Ctrl键没有被按下");
int nCount = -1;
switch (nKeyCode) {
case KeyEvent.VK_1:
nCount = 0;
break;
case KeyEvent.VK_2:
nCount = 1;
break;
case KeyEvent.VK_3:
nCount = 2;
break;
case KeyEvent.VK_4:
nCount = 3;
break;
case KeyEvent.VK_5:
nCount = 4;
break;
case KeyEvent.VK_6:
nCount = 5;
break;
case KeyEvent.VK_7:
nCount = 6;
break;
default:
return;
}
if (bControlDown) {
nCount = nCount + 7;
}
setPianoKeyDown(nCount);
showSound(nCount);
Graphics g = getGraphics();
g.drawImage(m_ImgDown, nCount * IMG_WIDTH, 0, this);
}
void mouseDragged(MouseEvent e) {
//Invoked when a mouse button is pressed on a component and then dragged.
//int nX = e.getX();
//int nY = e.getY();
//System.out.println("鼠标拖动到:x=" + nX + " y=" + nY);
int nX=e.getX();
//得到鼠标当前位置的X坐标
int m_nTempCount=nX/IMG_WIDTH;
//获得鼠标位置所对应的琴键序号
if(m_nTempCount==m_nOldDownCount)return;
//如果鼠标在一个琴键上移动,则返回
m_nState[m_nTempCount]=STATE_DOWN;
//将刚刚移进的琴键置于按下状态
m_nState[m_nOldDownCount]=STATE_UP;
//将鼠标刚刚移出的琴键置于释放状态
showSound(m_nTempCount);
m_nOldDownCount=m_nTempCount;
//存下这次所按的琴键
}
void mouseMoved(MouseEvent e) {
//Invoked when the mouse button has been moved on a component
//(with no buttons no down)
//int nX = e.getX();
//int nY = e.getY();
//System.out.println("鼠标移动到:x=" + nX + " y=" + nY);
}
}
class Piano_this_mouseAdapter
extends java.awt.event.MouseAdapter {
Piano adaptee;
Piano_this_mouseAdapter(Piano adaptee) {
this.adaptee = adaptee;
}
public void mouseClicked(MouseEvent e) {
adaptee.mouseClicked(e);
}
public void mouseEntered(MouseEvent e) {
adaptee.mouseEntered(e);
}
public void mouseExited(MouseEvent e) {
adaptee.mouseExited(e);
}
public void mousePressed(MouseEvent e) {
adaptee.mousePressed(e);
}
public void mouseReleased(MouseEvent e) {
adaptee.mouseReleased(e);
}
}
class Piano_this_keyAdapter
extends java.awt.event.KeyAdapter {
Piano adaptee;
Piano_this_keyAdapter(Piano adaptee) {
this.adaptee = adaptee;
}
public void keyPressed(KeyEvent e) {
adaptee.keyPressed(e);
}
public void keyReleased(KeyEvent e) {
adaptee.keyReleased(e);
}
public void keyTyped(KeyEvent e) {
adaptee.keyTyped(e);
}
}
class Piano_this_mouseMotionAdapter
extends java.awt.event.MouseMotionAdapter {
Piano adaptee;
Piano_this_mouseMotionAdapter(Piano adaptee) {
this.adaptee = adaptee;
}
public void mouseDragged(MouseEvent e) {
adaptee.mouseDragged(e);
}
public void mouseMoved(MouseEvent e) {
adaptee.mouseMoved(e);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -