Java KeyListener作为对象的子类不起作用

Java KeyListener作为对象的子类不起作用,java,user-interface,jpanel,subclass,keylistener,Java,User Interface,Jpanel,Subclass,Keylistener,基本上我想做的是,我有一个对象,叫做mainball。Mainball有一个keydetecter类作为其内部类,keydetecter被添加到构造函数上的Mainball中。主球在游戏中创建,但主球不响应击键 public Mainball(){ super(150,150,SIZE,SIZE); c= Color.RED; addKeyListener(new KeyDetecter()); } class KeyDetecter extends KeyAdapte

基本上我想做的是,我有一个对象,叫做mainball。Mainball有一个keydetecter类作为其内部类,keydetecter被添加到构造函数上的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;
        }
if(button.getText().equals(“游戏”)){
试一试{
game.walls=(ArrayList)SaveNLoad.load(“wall_info.txt”);
}捕获(异常e1){
game.walls=新的ArrayList();
}
框架。移除(当前_面板);
frame.add(游戏);
game.ball.requestFocusInWindow();/*ball是一个主球实例*/
当前_面板=游戏;
game.ball.x_中心=100;
game.ball.y_中心=40;
game.ball.y_速度=0;
}

来自
KeyEvent
的文档,该方法声明:

按键按下和按键释放事件不用于报告字符输入。因此,此方法返回的值保证仅对键类型的事件有意义


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

好的,我为您测试了它,效果非常好

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");
    }
}

不幸的是,它没有机会anything@Eren你调试程序了吗?我不知道如何使用调试器,但我确实在keyTyped下添加了system.out.print,但它不起作用,这意味着注册的
KeyEvent
没有触发。但是告诉我什么是
MainBall
类的超级功能?它是扩展JPanel的另一个对象,该对象只存储简单的数据,例如x_中心、y_中心、x_大小、y_大小。您直接将侦听器添加到侦听器到帧,这不是我所做的。Im将侦听器添加到对象,该对象添加到JPanel,该JPanel添加到JFrame@Eren方法
addKeyListener
在哪里?在Mainball中,你用
super
调用什么?addKeyListener在代码的第4行,我用super方法调用Virtual\u对象,它是另一个只存储基本属性的对象,例如x\u center,y_center@Eren发布所有相关类。公共抽象类虚拟_对象扩展JPanel实现可序列化{double x_center;double y_center;int x_size;int y_size;有点迂腐的词汇:“KeyDetecter”不是一个子类(它会扩展Mainball),它是一个内部类,其封闭类型是Mainball。@hiergiltdiestfu修复了它,谢谢