JPanel 重绘无法正常工作

JPanel repaint not working properly

我有一个 JPanel,class 称为 WorldPanel(查看下面的代码),我正在使用 KeyListener() 来移动它。它移动了,所以我不认为是 KeyListener 有问题。问题是当我在 JPanel 上调用 repaint() 时,它会慢慢停止重新绘制屏幕的一部分。所以(在 ​​1 和 0 中,0 是我的图像,1 是未重新绘制的部分)图像看起来像:

000000000000

repaint();

100000000000

repaint();

110000000000

等等

最终,整个面板停止重绘。

WorldPanel.java:

    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    //This Image is instantiated in the constructor

    //worldImage = ImageIO.read(new File("H:\Java\Game\src\res\WorldBase.png"));
    g.drawImage(worldImage, x, y, 6144, 4608, null);
}
public void setX(int x){
    this.x = x;
}
public void setY(int y){
    this.y = y;
}
public int getX(){
    return x;
}
public int getY(){
    return y;
}

实施class:

worldPanel.addKeyListener(new KeyListener(){
        Timer timer = new Timer(10, new ActionListener(){
            public void actionPerformed(ActionEvent e){
                worldPanel.repaint();
                timer.stop();
            }
        });
        @Override
        public void keyPressed(KeyEvent arg0) {
            if(arg0.getKeyCode() == KeyEvent.VK_W && worldPanel.getY() > 0){
                worldPanel.setY(worldPanel.getY() + 1);
                timer.start();
            }
            if(arg0.getKeyCode() == KeyEvent.VK_A && worldPanel.getX() > 0){
                worldPanel.setX(worldPanel.getX() +1);
                timer.start();
            }
            if(arg0.getKeyCode() == KeyEvent.VK_S && worldPanel.getY() < 4608){
                worldPanel.setY(worldPanel.getY() - 1);
                timer.start();
            }
            if(arg0.getKeyCode() == KeyEvent.VK_D && worldPanel.getX() < 6144){
                worldPanel.setX(worldPanel.getX() -1);
                timer.start();
            }
        }
        @Override
        public void keyReleased(KeyEvent arg0) {
        }
        @Override
        public void keyTyped(KeyEvent arg0) {
        }
    });

我环顾四周,我发现的一切都说:

问题是您正在覆盖 JComponent 方法 getX()/setX()/getY()/setY()。这会干扰面板涂漆面积的计算。给这些方法起一个不同的名字,即:setImageX()/getImageX()