如何让 keyEvent 在 Java 中工作?

How to get keyEvent to work in Java?

我对编程完全陌生Java。我无法让我的 keyEvents 无法工作。我正在制作的小游戏需要这个。这是我的代码:

package markusrytter.pingpong;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

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

public class main extends JPanel implements KeyListener {

    static int ballX;
    static int ballY;
    static int ballR = 15;

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.fillOval(ballX - ballR, ballY - ballR, ballR * 2, ballR * 2);
    }
    public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame("Sample Frame");
        main game = new main();
        frame.add(game);
        frame.setSize(1400, 800);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        ballX = frame.getContentPane().getSize().width / 2;
        ballY = frame.getContentPane().getSize().height / 2;

        while (true) {
            game.repaint();
            Thread.sleep(10);
        }
    }

    public void keyPressed(KeyEvent e) {
        System.out.println("A key is Pressed: " + e.getKeyCode());
        if(e.getKeyCode() == KeyEvent.VK_SPACE){
            System.out.println("Spacebutton pressed");
        }
    }
}

我希望有人能提供帮助,我曾尝试观看视频,但我还是 java 的新手。

最重要的是:更改 class 的名称。它被称为主要,这是一个坏主意。此外,更明智的做法是覆盖 paintComponent() 而不是 paint.

您没有将密钥监听器添加到 JFrame。您应该在 after creating game:

中调用它
frame.addKeyListener(game);

您还需要添加剩余的 KeyListener 方法。

应该就可以了。

  1. 您的代码无法编译,因为您没有(完全)实现 KeyListener

  2. 您没有在面板的构造函数中添加按键侦听器。

  3. KeyEvents 只发送给有焦点的组件。您的面板不可聚焦,因此它永远不会收到事件。您使用方法 setFocusable(true).

  4. 不要覆盖 paint()。相反,您应该覆盖 paintComponent(...).

  5. 您甚至不应该使用 KeyListener。相反,当使用 Swing 时,您应该使用 Key Bindings.

  6. 不要对 class.

  7. 的属性使用静态变量
  8. 您的 GUI 不是在 Event Dispatch Thread (EDT) 上创建的。

i have read articles, i have watched videos, and done everything exactly like them,

显然不行,否则它会起作用。

要获得正确的教程,请从 Swing Tutorial 开始。有以下部分:

  1. 如何编写 KeyListener
  2. 自定义绘画
  3. 按键绑定。
  4. 并发