尝试使用关键侦听器但形状不会移动

Trying to use key listener but shape won't move

我已经添加了一个键监听器来尝试让一个形状在我按下右箭头键时向右移动。但它不起作用。我真的不知道如何很好地使用 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) {
    }
}

在显示之前设置框架并删除仍然是 运行 的 while 循环。

 public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame ("Walking Man");
        frame.setSize(1080,720);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        WalkingMan game = new WalkingMan();
        frame.add(game);

        frame.setVisible(true);//Call visible method here

    }

您的代码存在一些问题

  1. 您从未将 KeyListener 添加到面板。
  2. A KeyListener for a JPanel 只有在可聚焦且聚焦时才有效。
  3. 覆盖 paintComponent 而不是 paint
  4. 在方法结束时调用setVisible
  5. 摆脱整个 while 循环,它只会导致问题。
  6. 使用 KeyBindings 而不是 KeyListeners。

没有键绑定的固定代码:

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) {

    }

}

为什么不像这样以更清晰的方式重构您的代码

import javax.swing.*;
import java.awt.*;
import javax.swing.border.LineBorder;
import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class WalkingMan  extends JFrame{
    EmilsKeyClass keyBoard = new EmilsKeyClass();

    public WalkingMan (){
        add(keyBoard,BorderLayout.CENTER);

        keyBoard.addKeyListener(new KeyAdapter(){
                @Override
                public void keyPressed(KeyEvent e){ 

                    if(e.getKeyCode()== KeyEvent.VK_ENTER){
                        x++;
                        repaint();
                    }
                }
            });
        keyBoard.setFocusable(true);
    }
    public static void main(String [] args){
        WalkingMan  frame = new WalkingMan ();

        frame.setTitle("Walking Man");
        frame.setSize(1080,720);   
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    public class EmilsKeyClass extends JPanel{
        int x = 0;
        int y = 0;

        public EmilsKeyClass(){            
        }

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

}