当前位置: 首页 > 知识库问答 >
问题:

Java:使用KeyAdapter的帮助

朱炳
2023-03-14
public class Board extends JPanel implements ActionListener{

Timer timer;
Tank tank = new Tank();

boolean boardset;

public Board(){
setBackground(Color.BLACK);

ImageIcon alien1ii = new ImageIcon(this.getClass().getResource("si_Alien1.png"));
Image alien1 = alien1ii.getImage();
ImageIcon alien2ii = new ImageIcon(this.getClass().getResource("si_Alien2.png"));
Image alien2 = alien2ii.getImage();
ImageIcon alien3ii = new ImageIcon(this.getClass().getResource("si_Alien3.png"));
Image alien3 = alien3ii.getImage();

timer = new Timer(5, this);
timer.start();

addKeyListener(new TAdapter());

JButton button = new JButton(new AbstractAction("hello2"){
    @Override
    public void actionPerformed(ActionEvent e){
        boardset = false;
    }
}); 
this.add(button);

//actual game
setFocusable(true);
setDoubleBuffered(true);
}

public void paint(Graphics g){
    super.paint(g);
    g.setColor(Color.WHITE);

    Graphics2D g2d = (Graphics2D) g;
    g2d.drawImage(tank.getTank(), tank.getx(), tank.getY(), this);

    g2d.drawLine(0, (tank.getY()+25), 400, (tank.getY()+25));

    Toolkit.getDefaultToolkit().sync();     
    g.dispose();
}

public class TAdapter extends KeyAdapter{
    public void keyPressed(KeyEvent e){
        tank.keyPressed(e);
        System.out.println("pressedddddddddddddddddd");
    }
    public void keyReleased(KeyEvent e){
        tank.keyReleased(e);
    }
}

public void setBoardset(boolean x){
    boardset = x;
}

public boolean getBoardset(){
    return boardset;
}

@Override
public void actionPerformed(ActionEvent e) {
        repaint();
        tank.move();
    }

}

在我看来,这应该是非常简单的,现在我使用这个print语句来查看类是否真的识别按键:public class TAdapter extends KeyAdapter{public void keyPressed(KeyEvent e){tank.keyPressed(e);system.out.println(“presseddddddddddddddddddddd”);}

但是,没有输出。所以我怀疑它根本无法识别任何击键。但我想不出为什么。如果有人有任何建议,我将不胜感激。显然,我有更多的代码可以共享,如果有人认为它对解决这个bug有用的话。

共有1个答案

司徒宇
2023-03-14

1)使用KeyBindings KeyListener有两个大问题,第一,你监听所有的键,第二,你必须有焦点和可聚焦。相反,KeyBinding你为一个键绑定,你不必在焦点上。

简单的例子:

AbstractAction escapeAction = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
         //code here example
         ((JComponent)e.getSource()).setVisible(Boolean.FALSE);
    }};
 String key = "ESCAPE";
 KeyStroke keyStroke = KeyStroke.getKeyStroke(key);
 component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, key);
 component.getActionMap().put(key, escapeAction);

可以使用这些JComponent常量

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 
WHEN_FOCUSED 
WHEN_IN_FOCUSED_WINDOW 
public class Board extends JPanel implements ActionListener{
 public class Board{
   private JPanel panel;

    private class MyActionListener implements ActionListener{
       //code here
    }
  }
 类似资料:
  • 一个在设置了Keylistener或Keyadapter类并重写了keyPressed之后,另两个在程序中如何获得键盘响应呢?例如,假设我已经设置了Keyadapter类: 我将如何从那里开始,使它能够实际检测到它,并在我按w时显示字符串?没有任何方法,我可以在main方法中调用,使它开始检查,是吗?如果没有,JVM如何知道开始检查main中是否没有方法告诉它? 谢谢你抽出时间。

  • 介绍 (Introduction) KeyAdapter类是一个用于接收键盘事件的抽象(适配器)类。 此类的所有方法都是空的。 此类是用于创建侦听器对象的便捷类。 类声明 以下是java.awt.event.KeyAdapter类的声明: public abstract class KeyAdapter extends Object implements KeyListener

  • 介绍 (Introduction) KeyAdapter类是一个用于接收键盘事件的抽象(适配器)类。 此类的所有方法都是空的。 此类是用于创建侦听器对象的便捷类。 Class 声明 (Class Declaration) 以下是java.awt.event.KeyAdapter类的声明 - public abstract class KeyAdapter extends Object

  • 我是一个编程初学者,我一直在做一个小项目,著名的游戏叫做俄罗斯方块,我遇到了这个小问题,我希望你能帮助我解决这个问题。我导入了:和以便能够使用我的键盘玩游戏,但是当我扩展我创建的类以使用这些键时,它显示了一个错误!! 错误发生在这里,说: 类TAdapter扩展keyAdapter{//第二个发生在此处:keyAdapter不能//解析为类型public void keyPressed(keyEv

  • 本文向大家介绍winforms 使用帮助类显示帮助,包括了winforms 使用帮助类显示帮助的使用技巧和注意事项,需要的朋友参考一下

  • 地址 https://mirrors.ustc.edu.cn/ros/ 说明 机器人操作系统(ROS)的软件源镜像。 使用说明 Ubuntu, Debian 将软件源添加至系统: sudo sh -c 'echo "deb https://mirrors.ustc.edu.cn/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.