java - 尝试使用关键监听器,但形状不会移动

标签 java swing netbeans jpanel keylistener

我添加了一个按键监听器,以尝试在按下向右箭头键时让形状向右移动。但它不起作用。我真的不知道如何很好地使用 keylistner。有人可以帮助我吗?

这是代码:

package walkingman;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class WalkingMan extends JPanel implements KeyListener{
    int x = 0;
    int y = 0;

    @Override
    public void paint(Graphics g){
        super.paint(g);
        g.fillOval(x, y, 150, 150);
    }

    public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame ("Walking Man");
        frame.setSize(1080,720);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        WalkingMan game = new WalkingMan();
        frame.add(game);

        while (true){
            game.repaint();
            game.keyPressed(e);
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT){
            x++;
        }
        repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }
}

最佳答案

您的代码存在一些问题

  1. 您永远不会将 KeyListener 添加到面板中。
  2. JPanelKeyListener 仅在可聚焦且也聚焦时才有效。
  3. 重写 paintComponent 而不是 paint
  4. 在方法末尾调用 setVisible
  5. 摆脱整个 while 循环,它只会导致问题。
  6. 使用KeyBindings而不是KeyListener
<小时/>

修复了没有键绑定(bind)的代码:

import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class WalkingMan extends JPanel implements KeyListener {
    int x = 0;
    int y = 0;

    @Override
    public void paintComponent(Graphics g) { // Overide paintComponent, not paint
        super.paintComponent(g);
        g.fillOval(x, y, 150, 150);
    }

    public WalkingMan() { // Class Constructor
        setFocusable(true); // KeyListeners only work if the component is focusable
        addKeyListener(this); // Add the KeyListener implemented by this class to the instance
    }

    public void createAndShowGUI() {
        JFrame frame = new JFrame("Walking Man");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        WalkingMan game = new WalkingMan();
        frame.add(game);

        frame.setSize(1080, 720);
        frame.setVisible(true); // Call setVisible after adding the components

        game.requestFocusInWindow(); // Request focus for the panel
    }

    public static void main(String[] args) throws InterruptedException {
        new WalkingMan().createAndShowGUI();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            x++;
        }
        repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

}

关于java - 尝试使用关键监听器,但形状不会移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39120612/

相关文章:

java - 省略 <?> 不直观地破坏了这段代码

java - 在 HQL 上使用 select 进行内部连接

java - 从解析树中获取某些节点

java - JOptionPane.showInputDialog 中的多个输入

java - 从所有者类(JFrame)中关闭 java 模式 JDialog

java - 我想在 Java 中的图像上创建一个不可见的可点击对象

java - Netbeans - 运行特定的 Maven 集成测试

java - 将/assets/image.png 转换为 byte[]

netbeans - 如何在 NetBeans 中禁用 "Run Monitor"?

java - Scene Builder 无法打开 FXML 文件