【问题标题】:How to run ActionListener and KeyListener at the same time?如何同时运行 ActionListener 和 KeyListener?
【发布时间】:2018-03-28 16:12:02
【问题描述】:

我正在尝试制作一个简单的游戏,但由于某种原因,当我尝试使用 KeyPressed 方法时没有任何反应。我尝试了几件事,发现错误是当我键入内容时程序从不输入 keyPressed 方法。我可以更改什么以使程序进入 keyPressed 方法?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Game extends JFrame {
    public static void main(String[] args) {
        Game maze = new Game();
        maze.run();
    }

    public void run() {
        JFrame frame = new JFrame("Game");
        frame.setSize(800, 600);
        frame.setLocation(50, 50);
        frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        frame.setResizable(true);
        GamePanel accessF = new GamePanel();
        frame.setContentPane(accessF);
        frame.setFocusable(true);
        frame.setVisible(true);
    }
}

class GamePanel extends JPanel {

    int xDino, velX, velPlayerX, velPlayerY, xPlayer, yPlayer, code, code2;

    public GamePanel() {
        Timer tmD = new Timer(100, new DinoHandler());
        tmD.start();
        xDino = -800;
        velX = 2;
        velPlayerX = 0;
        velPlayerY = 0;
        xPlayer = 50;
        yPlayer = 50;
        KeyHandler ship = new KeyHandler();
        addKeyListener(ship);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.WHITE);
        Image space = new ImageIcon("simple-star-space-background-effect-footage-023768280_prevstill.jpg").getImage();
        g.drawImage(space, xDino, 0, 1600, 600, null);
        if (xDino == 0) xDino = -800;

        g.setColor(Color.GRAY);

        g.fillRect(xPlayer, yPlayer, 50, 50);
    }

    class DinoHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            xDino = xDino + velX;
            System.out.print(xDino);
            repaint();
        }
    }

    class KeyHandler implements KeyListener {
        public void keyPressed(KeyEvent e) {
            requestFocus();
            xDino = 100;
            code = e.getKeyCode();
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                xPlayer = 60;
                velPlayerY = 2;
            }

            if (code == KeyEvent.VK_DOWN) {
                velPlayerY = -2;
            }

            if (code == KeyEvent.VK_LEFT) {
                velPlayerX = -2;
            }

            if (code == KeyEvent.VK_RIGHT) {
                velPlayerX = 2;
            }
            repaint();
        }

        public void keyReleased(KeyEvent e) {
            code2 = e.getKeyCode();
            if (code2 == KeyEvent.VK_UP) {
                velPlayerY = 0;
            }

            if (code2 == KeyEvent.VK_DOWN) {
                velPlayerY = 0;
            }

            if (code2 == KeyEvent.VK_LEFT) {
                velPlayerX = 0;
            }

            if (code2 == KeyEvent.VK_RIGHT) {
                velPlayerX = 0;
            }
            repaint();
        }

        public void keyTyped(KeyEvent e) {
            System.out.println("hi");
        }
    }
}

【问题讨论】:

  • 欢迎来到 SO。请在发布之前考虑格式化您的代码,这样会更容易阅读和回答。谢谢。

标签: java actionlistener keylistener


【解决方案1】:

使面板具有焦点并请求焦点

public void run() {
    JFrame frame = new JFrame("Game");
    frame.setSize(800, 600);
    frame.setLocation(50, 50);
    frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    frame.setResizable(true);
    GamePanel accessF = new GamePanel();
    frame.setContentPane(accessF);
    accessF.setFocusable(true);
    accessF.requestFocusInWindow();

    frame.setVisible(true);
}

【讨论】:

  • 这并没有解决问题。我真的坚持我应该改变什么。
  • 这个代码在我的机器上运行。稍后我会发布完整列表。
猜你喜欢
  • 2016-09-21
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多