Java 图像不移动

Java 图像不移动,java,swing,awt,keylistener,paintcomponent,Java,Swing,Awt,Keylistener,Paintcomponent,我的图像不移动。 以下是应用程序的完整代码: package Game; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.io.File; impo

我的图像不移动。
以下是应用程序的完整代码:

package Game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JPanel {

    private static final long serialVersionUID = 1L;

    private BufferedImage image;

    public static final int WIDTH = 600;
    public static final int HEIGHT = 500;
    private int x = 1;
    private int y = 1;

    private static int dx;
    private static int dy;

    private boolean leftPressed = false;
    private boolean rightPressed = false;
    private boolean topPressed = false;
    private boolean downPressed = false;

    public static void main(String avg[]) throws IOException {
        Game abc = new Game();

    }

    public Game() {
        try {
            JFrame frame = new JFrame();
            image = ImageIO.read(new File(
                    "C:\\Users\\дНМ\\workspace\\Game\\image\\heroG.png"));

            frame.setSize(WIDTH, HEIGHT);
            frame.setVisible(true);
            frame.getContentPane().add(this);
            this.setBackground(Color.BLACK);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setTitle("Tittle - Game");
            addKeyListener(new KeyInputHandler());
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }



    public void move() {

        x += dx;
        y += dy;

        if (x < 1) {
            x = 1;
        }

        if (y < 1) {
            y = 1;
        }
    }

    public void update(long delta) {
        if (leftPressed == true) {
            x--;
        }
        if (rightPressed == true) {
            x++;
        }
    }

    public void update2(long delta) {
        if (downPressed == true) {
            y--;
        }
        if (topPressed == true) {
            y++;
        }
    }

    private class KeyInputHandler extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                leftPressed = true;
                dx = -1;
            }
            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                rightPressed = true;
                dx = 1;
            }
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                topPressed = true;
                dy = -1;
            }
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                downPressed = true;
                dy = 1;
            }
        }

        public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                leftPressed = false;
                dx = 0;
            }
            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                rightPressed = false;
                dx = 0;
            }
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                topPressed = false;
                dy = 0;
            }
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                downPressed = false;
                dy = 0;
            }
        }
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, x, y, null); 
    }
}
打包游戏;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类游戏扩展JPanel{
私有静态最终长serialVersionUID=1L;
私有缓冲图像;
公共静态最终整数宽度=600;
公共静态最终内部高度=500;
私有整数x=1;
私有整数y=1;
私有静态int-dx;
私有静态int-dy;
私有布尔leftPressed=false;
private boolean rightPressed=false;
private boolean topPressed=false;
private boolean downPressed=false;
公共静态void main(字符串平均值[])引发IOException{
游戏abc=新游戏();
}
公共游戏(){
试一试{
JFrame=新JFrame();
image=ImageIO.read(新文件(
“C:\\Users\\crmkМ\\workspace\\Game\\image\\heroG.png”);
框架尺寸(宽度、高度);
frame.setVisible(true);
frame.getContentPane().add(这个);
这个.背景(颜色.黑色);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle(“title-Game”);
addKeyListener(新的KeyInputHandler());
}捕获(IOEX异常){
例如printStackTrace();
}
}
公开作废动议(){
x+=dx;
y+=dy;
if(x<1){
x=1;
}
if(y<1){
y=1;
}
}
公共无效更新(长增量){
if(leftPressed==true){
x--;
}
如果(右按==真){
x++;
}
}
公共无效更新2(长增量){
如果(按下==真){
y--;
}
如果(顶置==真){
y++;
}
}
私有类KeyInputHandler扩展了KeyAdapter{
按下公共无效键(按键事件e){
如果(例如getKeyCode()==KeyEvent.VK_左){
leftPressed=true;
dx=-1;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
rightspressed=true;
dx=1;
}
如果(例如getKeyCode()==KeyEvent.VK_UP){
压顶=正确;
dy=-1;
}
如果(例如getKeyCode()==KeyEvent.VK_DOWN){
downPressed=true;
dy=1;
}
}
公共无效密钥已释放(密钥事件e){
如果(例如getKeyCode()==KeyEvent.VK_左){
leftPressed=false;
dx=0;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
右压=假;
dx=0;
}
如果(例如getKeyCode()==KeyEvent.VK_UP){
压顶=假;
dy=0;
}
如果(例如getKeyCode()==KeyEvent.VK_DOWN){
按下=假;
dy=0;
}
}
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 drawImage(图像,x,y,空);
}
}
怎么了?

请指出您可能需要添加的错误。

首先:您的面板没有截取关键事件,请检查以下问题:

Second:当按下一个键时,您可以更改变量
dx
dy
,但您没有调用
move()
方法

第三个在按下每个键后,您不会重新绘制

这些是修改:

游戏构造器

钥匙适配器


所有的节目,但当你按下按钮时图片不移动为什么你认为它应该移动?好吧,我写了一个移动的方法,但它们显然不起作用。。。你能告诉我出了什么问题吗?你从来没有重新粉刷过你的组件,我该如何使它工作?有什么要补充的吗?
public Game() {
    try {
        JFrame frame = new JFrame();
        image = ImageIO.read(new File("Zombatar.jpg"));

        frame.setSize(WIDTH, HEIGHT);
        frame.setVisible(true);
        frame.getContentPane().add(this);
        this.setBackground(Color.BLACK);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Tittle - Game");

        addKeyListener(new KeyInputHandler());

        //this is important to intercept key events
        setFocusable(true);
        requestFocusInWindow();

    } catch (IOException ex) {
        ex.printStackTrace();
    }
}
private class KeyInputHandler extends KeyAdapter {

    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            dx = -1;
        }
        else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            dx = 1;
        }
        else if (e.getKeyCode() == KeyEvent.VK_UP) {
            dy = -1;
        }
        else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            dy = 1;
        }

        //first call move to update x and y and later repaint tha JPanel
        move();
        repaint();
    }
}