【问题标题】:Keyboard input with KeyAdapter带 KeyAdapter 的键盘输入
【发布时间】:2014-04-21 21:14:50
【问题描述】:

我正在尝试用 java 制作一个简单的游戏,您可以在其中向 4 个方向移动玩家(后卫)。我尝试使用密钥适配器进行密钥检测,但它不起作用。可能是什么问题(我试图在按键时执行 System.out.println 以确保问题不在 Defender 上)? 代码:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class DefenderComponent extends JPanel implements ActionListener {
    private static final long serialVersionUID = 1L;

    private static final int WIDTH = 160;
    private static final int HEIGHT = 120;
    private static final int SCALE = 4;

    Defender player = new Defender();

    public DefenderComponent() {
        Dimension size = new Dimension(WIDTH * SCALE, HEIGHT * SCALE);
        setMinimumSize(size);
        setMaximumSize(size);
        setPreferredSize(size);

        addKeyListener(new TKeyListener());

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

    public static void main(String[] args) {
        JFrame frame = new JFrame("Test2");
        frame.add(new DefenderComponent());
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        frame.setFocusable(true);

        new DefenderComponent();
    }


    public void paintComponent(Graphics g){
        Graphics2D g2d = (Graphics2D) g;
        Image i = player.getImage();
        g2d.drawImage(i, player.getX(), player.getY(), i.getWidth(this) * SCALE, i.getHeight(this) * SCALE, this);
    }

    public void actionPerformed(ActionEvent e) {
        player.move();
        repaint();  
    }
}

【问题讨论】:

    标签: java swing animation paintcomponent keylistener


    【解决方案1】:

    KeyEvents 只为具有焦点的组件生成。 JPanel 默认情况下是不可聚焦的。

    不要使用 KeyListener。相反,您应该使用更灵活的键绑定。

    有关更多信息和示例,请参阅Motion Using the Keyboard

    【讨论】:

      【解决方案2】:
      frame.addActionListener(this);
      

      是你错过的。

      那行说。这个类是一个 ActionListener。请在收到操作时调用此类。

      如果你想将 ActionListener 添加到 JPanel

      public DefenderComponent() {
          addActionListener(this);
          ....
      }
      

      【讨论】:

      • 我将侦听器添加到 JPanel。对不对?
      • 您必须在 JPanel 中调用 addActionListener。仅仅在 JPanel 中定义方法是行不通的。
      • JPanel 没有动作监听器。
      猜你喜欢
      • 2013-08-21
      • 1970-01-01
      • 2011-06-20
      • 2014-08-14
      • 2017-09-30
      • 1970-01-01
      • 2016-12-09
      • 2010-09-21
      • 2010-12-15
      相关资源
      最近更新 更多