import java.awt.*;
import java.awt.event.*;public class MyKeyEvent {
public static void main(String[] args) {
new MyFrame("MyKeyEvent");
}
}class MyFrame extends Frame {
Label b;
MyFrame(String s) {
super(s);
setLayout(null);
b = new Label("can move");
add(b);
b.setBounds(50, 50, 20, 20);
setBounds(100, 100, 100, 100);
setBackground(Color.PINK);
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
switch(keyCode) {
case KeyEvent.VK_UP :   //A
  b.setLocation(50, 20);
  break;
case KeyEvent.VK_DOWN : //B
b.setLocation(50, 70);
break;
}
}
});
setVisible(true);
}
}// 请问这段代码中的A和B处为什么不能写成e.VK_UP和e.VK_DOWN ?  VK_UP和VK_DOWN既然都是静态变量,为什么不能用
// KeyEvent由对象来调用呢?

解决方案 »

  1. case语句后面必须是编译期常量
      

  2. 其实你在一般的代码块里写是没问题的!但是你在switch,一定要用常量,switch里面必须用类来用它的字段!
      

  3. case(a) a必须是整型或字符型的变量吧,不知道编译期常量和它们有什么区别?
      

  4. 答:编译期常量就是在编译期间,它们的值就已经由编译程序计算出来了(而不是由程序运行时才能计算出来的那值)。
    而:switch中的case 后面跟的必须是编译其的常量表达式。如:
    final int y=2;
    则:case 1+y: 就是一个编译期的常量表达式
      

  5. 编译期常量在编译的时候就有确定值,如KeyEvent.VK_UP,但e是函数参数,是运行时才能确定的,所以e.VK_UP不能防在case后面
      

类似问题 »