KeyListener作为Object的子类不起作用

时间:2015-04-28 14:06:48

标签: java user-interface jpanel subclass keylistener

基本上我要做的是,我有一个对象,叫做mainball。 Mainball有一个keydetecter类作为它的内部类,keydetecter被添加到构造函数的mainball上。 Mainball是在游戏中创建的,但是mainball不响应键击。

public Mainball(){
    super(150,150,SIZE,SIZE);
    c=  Color.RED;
    addKeyListener(new KeyDetecter());
}
class KeyDetecter extends KeyAdapter{

    public KeyDetecter(){
    }

    double velocityfactor = 0.8;

    public void keyPressed(KeyEvent e){
        if(e.getKeyChar() == 'a'){
            x_velocity = -velocityfactor;
        }
        if(e.getKeyChar() == 'd'){
            x_velocity = velocityfactor;
        }
        if(e.getKeyChar() == 's'){
            ball.y_velocity = velocityfactor;
        }
        if(e.getKeyChar() == 'w'){
            y_velocity = -velocityfactor;
        }
        if(e.getKeyCode() == '1'){
            Shoot_Type = the_Game.SHOOT_ARROW;
        }
        if(e.getKeyCode() == '2'){
            Shoot_Type = the_Game.SHOOT_PARTICLE;
        }
    }

游戏请求关注窗口以及

if(button.getText().equals("Game")){
            try {
                game.walls = (ArrayList<wall>) SaveNLoad.load("wall_info.txt");
            } catch (Exception e1) {
                game.walls = new ArrayList<wall>();
            }
            frame.remove(current_panel);
            frame.add(game);
            game.ball.requestFocusInWindow(); /* ball is an mainball instance */
            current_panel = game;
            game.ball.x_center = 100;
            game.ball.y_center = 40;
            game.ball.y_velocity = 0;
        }

2 个答案:

答案 0 :(得分:0)

KeyEvent getKeyChar()方法的文档说明:

  

KEY_PRESSED和KEY_RELEASED事件不用于报告字符输入。因此,此方法返回的值保证仅对KEY_TYPED事件有意义。

因此,在上面的示例中,我认为如果将整个代码放在KeyAdapter's keyTyped(KeyEvent e)方法中进行密钥处理会更好。

答案 1 :(得分:0)

好的,我为你测试过,这个效果非常好。

public static void main(String[] args) {
        JFrame t = new JFrame();
        t.setSize(500, 500);
        t.addKeyListener(new KL());
        t.setVisible(true);
    }

public static class KL extends KeyAdapter{

    public void keyPressed(KeyEvent e){
        if(e.getKeyChar() == 'a') System.out.println("a pressed");
    }
}