JPanel 重新粉刷无法正常工作



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

000000000000

repaint();

100000000000

repaint();

110000000000

等。

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

世界专题.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;
}

类的实现:

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

我环顾四周,找到的都是:

  • 在 EDT 上调用重绘(尝试使用计时器)
  • paintComponent方法中调用updateUI()(显然是某些人最不喜欢的解决方案)(尝试过,不起作用)
  • 最后,打电话super.paintComponent(g) .也试过了,看看paintComponent.

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

最新更新