为什么我的椭圆形不移动Java

Pla*_*aix 3 java swing paint keylistener jframe

我正在写一点点像蛇的游戏,我正在执行的关键事件监听器,所以它监听当按下方向键它递增或递减的框架椭圆的位置.以下是我的代码,您认为发生了什么?我试着谷歌搜索可能的解决方案,但我结果是空的.

package snakegame;

import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;

/**
 *
 * @author PlaixHax0r
 */
public class SnakeGame extends JFrame{

    int x, y;

    public class ActionListener extends KeyAdapter{
        public void KeyPressed(KeyEvent a){

            int KeyCode = a.getKeyCode();

            if(KeyCode == KeyEvent.VK_RIGHT){
                x++;
            }

            if(KeyCode == KeyEvent.VK_LEFT){
                x--;
            }

            if(KeyCode == KeyEvent.VK_DOWN){
                y++;
            }

            if(KeyCode == KeyEvent.VK_UP){
                y--;
            }


        }

        public void KeyReleased(KeyEvent a){

        }

    }



    public SnakeGame(){
        addKeyListener(new ActionListener());
        setTitle("Snake 1.0");
        setVisible(true);
        setSize(500, 500);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        x=150;
        y=150;

    }

    public void paint(Graphics g){
        g.drawString("Welcome to Snake Empire", 180, 50);
        g.fillOval(x, y, 15, 15);

        repaint();
    }


    public static void main(String[] args) {
        new SnakeGame();

    }
}
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 11

几条建议:

  • 不要直接在JFrame中绘制.查看绘图教程,您将看到在JPanel或其他JComponent的paintComponent(...)方法覆盖中绘制.
  • 你的第一行paintComponent(...)通常是调用super的方法:super.paintComponent(g)
  • 不要repaint()在里面打电话paint(...)paintComponent(...).这是尝试不受控制的动画的不好方法.
  • 请改用Swing Timer.
  • 不要将类命名为核心类,特别是不要将其命名为ActionListener,因为这将使您几乎不可能在需要时使用实际的ActionListener.
  • KeyListeners仅在侦听的组件具有焦点且具有焦点时才起作用.
  • 避免将KeyListeners与Swing应用程序一起使用,而是使用Key Bindings.请搜索这个网站,因为这已经多次讨论了许多例子,一些我的.

请查看Key Bindings Tutorial,然后查看我在此处此处使用Key Bindings的示例代码.


JB *_*zet 5

我看到的问题除了气垫船看到的问题外:

  • 你没有覆盖任何KeyListener(或KeyAdapter)方法.您的方法已命名KeyPressed,方法始终以Java中的小写字母开头.该方法被命名keyPressed().当您打算覆盖方法时,始终使用@Override注释.这样,当你没有因为你的方法名称中有拼写错误时,你会收到编译错误:

     @Override
     public void keyPressed(KeyEvent event) {
         ...
     }
    
    Run Code Online (Sandbox Code Playgroud)
  • 当按下某个键时你没有调用repaint(),所以Swing没有理由重新绘制你的帧.