4

当程序运行时,我需要在不同的位置不断地重绘某个图像。所以我设置了一个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);
4

3 回答 3

4

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

相反,您需要使用 Swing Timer 来安排每 100 毫秒左右的动画。然后,当计时器触发时,您更新 x 位置并在面板上调用 repaint()。阅读有关使用 Swing 计时器的 Swing 教程以获取更多信息。

于 2013-07-25T19:57:59.813 回答
2

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

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

这将按照 Timer 构造函数中的指定每 10 毫秒移动一次图像。

于 2013-07-25T19:58:16.643 回答
0

和我一样,这是刚开始从事动画工作的人们经常遇到的问题。您不能从屏幕上“删除图像”。但是,您可以重新绘制整个屏幕,然后在新位置重新绘制图像。

在伪代码中:

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

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

编辑:我没有阅读您的代码,我只是解决了您的问题。因此,修复您的代码的其他答案可能比我的更好。

于 2013-07-25T19:56:56.507 回答