如何在Java中删除或取消图像?

时间:2017-12-25 17:02:16

标签: java eclipse swing jpanel graphics2d

我正在尝试在JPanel中为背景设置动画,但在几个周期后,背景开始产生这种“拖影”效果。我认为这是因为Java不断地覆盖以前的图像,但我似乎无法找到一种“取消绘制”图像的方法。

Background类的一部分

public void setPosition(double x, double y) {

    this.x = (x * moveScale) % GamePanel.WIDTH; 
    this.y = (y * moveScale) % GamePanel.HEIGHT;

}

public void setVector(double dx, double dy) {

    this.dx = dx;
    this.dy = dy;

}

public void update() {

    x += dx % GamePanel.WIDTH;
    y += dy % GamePanel.HEIGHT;  

}

public void draw(Graphics2D g) {

    g.drawImage(image, (int) x, (int) y, null);


    if (x < 0) {

        g.drawImage(image, (int) x + GamePanel.WIDTH, (int) y, null);

    }

    if (x > 0) {

        g.drawImage(image, (int) x - GamePanel.WIDTH, (int) y, null);

    }

}

Menu类的一部分,它被称为

public void update() {

    bg.update();

}

public void draw (Graphics2D g) {

    bg.draw(g);

    g.setColor(titleColor);
    g.setFont(titleFont);
    g.drawString("Save Squishy!", 80, 70);

    g.setFont(font);
    for (int i = 0; i < options.length; i++) {

        if (i == currentChoice) {

            g.setColor(Color.BLACK);

        } else {

            g.setColor(Color.RED);

        }

        g.drawString(options[i], 145, 140 + (i * 15));

    }

}

第一个周期正常工作:

Works fine for the first cycle

然后开始涂抹

Then Starts to smear

1 个答案:

答案 0 :(得分:1)

在您的示例中,您应该使用从paintComponent(g)这样的容器类重写的JPanel方法,而不是创建自己的绘制/绘制方法或使用从图像获取的图形对象。像这样,你可以避免重新绘制的麻烦,只需在扩展JPanel的类上调用repaint()

如评论中所述,建议使用paintComponent(g)方法。从这样的事情开始:

public class TestImage extends JPanel {
    private BufferedImage bimg = null;

    public TestImage() {
        // initiate the class ...
        try {
            bimg = ImageIO.read(new File("C:/Path/To/Image/image.jpg"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(bimg, 0, 0, null);
        // do other painting stuff with g
    }

    public static void main(String[] args) {
        JFrame fr = new JFrame("Image test demo");
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fr.setSize(600, 400);
        fr.setLocationRelativeTo(null);
        fr.add(new TestImage());
        fr.setVisible(true);
    }
}