繁体   English   中英

JPanel重新绘制无法正常工作

[英]JPanel repaint not working properly

我有一个JPanel,类称为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;
}

执行类:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM