日期:2014-05-20  浏览次数:20722 次

响应键盘事件
package com.mygui;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;


class MyFrame extends JFrame{
private static final long serialVersionUID = 1L;
TextField text1=new TextField(30);
public MyFrame(){
super("测试窗口");
add(new Label("按下键盘"),BorderLayout.NORTH);

add(new Button("我的按怒"),BorderLayout.SOUTH);
  //add(text1,BorderLayout.SOUTH);
this.addKeyListener(
new KeyAdapter(){
public void keyPressed(KeyEvent e){
int i=e.getKeyCode();
System.out.println("i="+i);
if(i == KeyEvent.VK_UP ){
System.out.println("按下了上箭头键");
 
}
if(i == KeyEvent.VK_DOWN){

System.out.println("按下了下箭头键");
}
}
}
);
pack();
setVisible(true);
}
}
public class MyKeyEventTest {
public static void main(String[] args) {
MyFrame t= new MyFrame();
}

}


去掉 add(new Button("我的按怒"),BorderLayout.SOUTH);
add(text1,BorderLayout.SOUTH); 这两行代码,按下键盘的方向键 "上"和"下" 就有反应,能够正常输出,为什么添加后,没反应呢??

------解决方案--------------------
因为你的KeyEvent的监听者处理的是JFrame上的按键事件,那么默认光标要落在JFrame上,但是添加了交互组件button和textfield后,光标会默认放置在该Frame上第一个交互组件上,所以你的按键事件都是在该交互组件上的,应该由它们的按键事件监听者去处理,Frame根本就得不到。你可以把this.addKeyListener改成text1.addKeyListener就能正常输出了。还有,别同时在south添加两个组件,这里button会被text1覆盖