【问题标题】:How to get keyEvent to work in Java?如何让 keyEvent 在 Java 中工作?
【发布时间】:2016-12-23 15:05:25
【问题描述】:

我对 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 新手。

【问题讨论】:

  • (1-) 不知道为什么会有这么多赞成票。 OP 表示他们阅读文章并直接复制代码。你不认为直接复制代码应该可以工作吗?

标签: java swing keyboard keyevent key-events


【解决方案1】:
  1. 您的代码将无法编译,因为您没有(完全)实现 KeyListener

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

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

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

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

  6. 不要对类的属性使用静态变量。

  7. 您的 GUI 不是在 Event Dispatch Thread (EDT) 上创建的。

我读过文章,我看过视频,所做的一切都和他们一模一样,

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

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

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

【讨论】:

    【解决方案2】:

    最重要的是:更改班级名称。它被称为 main ,这是一个坏主意。此外,最好覆盖paintComponent() 而不是paint

    您没有将 keylistener 添加到 JFrame。您应该在创建 game 之后在您的主 中调用它:

    frame.addKeyListener(game);
    

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

    应该这样做。

    【讨论】:

    • 然后它说:不能在静态引用中使用它
    • @markusrytter 注意到我的编辑。 (将this 更改为game
    • @markusrytter 没问题。但是,您应该将 paint 方法更改为 paintComponent
    • @ItamarGreen,很高兴你继续复制我的建议。
    • @camickr 或者,而不是那样,我实际上回答了它而没有注意到它也回答了它,并且只知道你建议的事情。我发现最好先向某人展示他们做对了什么,然后再展示他们做错了什么,而不是反过来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多