在 JPanel 上的 paintComponent() 性能不佳



我在这里发布的代码有性能问题。我是一个 JAVA 新手,我正在尝试在 JPanel 上重新绘制图像,然后将其显示在 JFrame 上。经过大量的试验和错误,代码终于可以工作了。问题是它的性能非常低。正在重新绘制的图像似乎滞后。此外,当我在屏幕上移动 JFrame 时,它会滞后。我在OS Linux Mint上使用Eclipse。我不确定这是问题还是代码。我将非常感谢任何帮助!

谢谢西蒙

主类:

package pack1;
import java.awt.Graphics;
import java.awt.Graphics2D;
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 Main extends JPanel {
/**
 * 
 */
private static final long serialVersionUID = -7460454277320732933L;
public static BufferedImage image;
public static int y = 0;
public static BufferedImage image2;
public static int y2 = -600;
public Main() {
    try {
     image = ImageIO.read(new File("spazio/stelle.png"));
     image2 = ImageIO.read(new File("spazio/stelle.png"));
    }
    catch (IOException e){
        e.printStackTrace();
        System.out.println("Quadro non esiste");
    }
}
@Override
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(image, 0, y, 800,600,null);
g2.drawImage(image2, 0, y2,800,600,null);
repaint();
}

public static void main(String[] args) {
    JFrame f = new JFrame("Spazio");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Main panel = new Main();
    panel.setBounds(0, 0, 800, 600);
    f.add(panel);
    f.setSize(image.getWidth(),image.getHeight());
    f.setVisible(true);
    new Background();
    }
}

班级背景:

package pack1;
import java.util.TimerTask;
import java.util.Timer;
public class Background {
 Timer back;
    public Background(){
    back = new Timer();
    back.scheduleAtFixedRate(new TimerTask (){
        @Override
 public void run(){
     if (Main.y<600) {
         Main.y+= 2;
     }
     if (Main.y2<600) {
         Main.y2+=2;
     }
     else if (Main.y>=600) Main.y = 0;
     else if (Main.y2>=600) Main.y2=-595; 
 }},0,80);


    }
}

MadProgrammer在他的评论中是正确的。 您的第一个更改应该是这个。

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.drawImage(image, 0, y, 800, 600, null);
    g2.drawImage(image2, 0, y2, 800, 600, null);
}

始终调用超级油漆组件,并且永远不要在油漆组件方法内部重新绘制。

最新更新