Java .drawImage:如何“取消”或删除图像?

时间:2013-07-25 19:53:26

标签: java image swing graphics2d paintcomponent

我需要在程序运行时不断地在不同位置重绘某个图像。所以我设置了一个应该在屏幕上移动图像的while循环,但它只是一遍又一遍地重绘图像。我究竟做错了什么?有没有办法在将旧图像绘制到新位置之前将其删除?

        JFrame frame = buildFrame();

    final BufferedImage image = ImageIO.read(new File("BeachRoad_double_size.png"));

    JPanel pane = new JPanel() {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int num = 0;
            boolean fluff = true;
            while (fluff == true) {
            num = num + 1;
            g.drawImage(image, num, 0, null);
            if (num == 105) {
                fluff = false;
            }
            }
        }
    };


    frame.add(pane);

3 个答案:

答案 0 :(得分:3)

您无法在paintComponent()方法中编写循环代码。代码将执行得如此之快,以至于图像只会在最终位置绘制,在您的情况下,x位置应为105.

相反,您需要使用Swing Timer每100毫秒左右安排一次动画。然后当计时器触发时,您更新x位置并调用面板上的repaint()。有关详细信息,请阅读Using Swing Timers上的Swing教程。

答案 1 :(得分:2)

paintComponent方法中放置while循环不是这样做的。相反,应该有一些如下设置:

...
final int num = 0;
final JPanel pane;
Timer timer = new Timer(10, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        num++;
        pane.repaint();
    }
});
pane = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, num, 0, null);
    }
});

timer.start();

这会将图像移动10毫秒,如Timer构造函数中所指定的那样。

答案 2 :(得分:0)

这是人们开始动画时常见的问题,正如我所做的那样。您无法从屏幕上“删除图像”。但是,您可以重新绘制整个屏幕,然后在新位置重新绘制图像。

在伪代码中:

while (condition)
   background(white); //or whatever color your background is
   drawImage(x,y);

上面的代码会清除屏幕,因此您可以安全地重绘图像。这有效地“删除”了您的图像。

编辑:我没有阅读您的代码,我刚刚解决了您的问题。所以修复代码的其他答案可能比我的好。