Java .drawImage : How do I “unDraw” or delete a image?

拈花ヽ惹草 提交于 2020-01-14 18:06:15

问题


I need a certain image to be redrawn at different locations constantly as the program runs. So I set up a while loop that should move an image across the screen, but it just redraws the image on top of itself over and over again. What am I doing wrong? Is there a way to delete the old image before drawing it in a new location?

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

回答1:


You can't code a loop in the paintComponent() method. The code will execute so fast that the image will only be painted in the final position, which in your case should be with an x position of 105.

Instead you need to use a Swing Timer to schedule the animation every 100 milliseconds or so. Then when the timer fires you update the x position and invoke repaint() on the panel. Read the Swing tutorial on Using Swing Timers for more information.




回答2:


Putting a while loop inside a paintComponent method is not the way to do it. Instead, there should be some setup like the following:

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

This will move the image ever 10 milliseconds, as specified in the Timer constructor.




回答3:


This is a common issue people starting out in animation have, as I did. You can't 'remove an image' from the screen. However, you can repaint the entire screen, then redraw your image at a new location.

In psuedocode:

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

The code above clears the screen so it's safe for you to redraw your image. This effectively 'deletes' your image.

Edit: I didn't read your code, I just addressed your question. So other answers that fix your code are probably better than mine.



来源:https://stackoverflow.com/questions/17867537/java-drawimage-how-do-i-undraw-or-delete-a-image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!