public class TestDrawFrame { public static void main(String[] args) {
new frame("test draw frame");
}}class frame extends Frame {
ArrayList<Point> al = null; frame(String s) {
super(s);
al = new ArrayList();
this.setLayout(null);
Button b = new Button("ok");
b.setBounds(50, 50, 200, 200);
this.setSize(500, 500);
this.setLocation(300, 300);
this.setBackground(Color.gray);
this.add(b);
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int i = e.getKeyCode();
if (i == (KeyEvent.VK_UP)) {
System.out.println("dsfasfddsafsaf");
}
}});
this.addMouseListener(new mouseclick());
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(0);
} });
this.setVisible(true);
}

public void addpoint(Point p) {
al.add(p);
} public void paint(Graphics g) {
Iterator i = al.iterator();
while (i.hasNext()) {
Point p = (Point) i.next();
g.setColor(Color.yellow);
g.fillOval(p.x, p.y, 20, 20);
}
} class mouseclick extends MouseAdapter {
public void mousePressed(MouseEvent e) {
frame t = (frame) e.getSource();
t.addpoint(new Point(e.getX(), e.getY()));
t.repaint();
}
}}

解决方案 »

  1.   

    楼主看看有没有可能焦点在button上,所以键盘事件不响应
      

  2.   

    是啊,楼主你的焦点就落在Button上。
      

  3.   

    这个问题是焦点策略引发的。通常来说,如果没有设置自定义的焦点策略的话,默认获得焦点的是左上角的第一个可获得焦点的组件,所以添加了一个按钮,那么默认获得焦点的就是按钮,监听的对象必须持有焦点,所以你的键盘监听失效。你可以设置自己的焦点循环策略,其实只需要修改一个下面的持有默认焦点的方法:this.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy(){
    @Override
    public Component getDefaultComponent(Container container) {
    return frame.this;
    }
    });设置Frame本身是默认焦点的持有者,那么你的键盘监听就生效了