Разработка игры. Многократное копирование изображения - Java

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Проблема следующая: при перемещении изображения оно оставляет след из своих многочисленных копий наложенных друг на друга. При этом вместе с этим компонентом перемещаются все изображения на экране и также оставляют за собой многочисленные копии наложенные друг на друга. Ниже привожу код:
package viewPG;
 
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import java.io.File;
import javax.imageio.ImageIO;
import modelPG.mapPG.MapObject;
import modelPG.Model;
 
class Map extends JPanel{
 
    private int width;
    private int height;
    private int countCellInRow;
    private int countCellInColumn;
    private Image[][] images;
    private Model model;
 
    Map(Model model) {
    this.model = model;
    this.width = model.getWidthMap();
    this.height = model.getHeightMap();
    this.countCellInRow = model.getCountCellInRow();
    this.countCellInColumn = model.getCountCellInColumn();
 
    setSize(width, height);
    
    images = new Image[countCellInColumn][countCellInRow];
 
    assembleMap();
    }
 
    //Часть кода пропущена    
 
    public void paintComponent(Graphics g) {
    for(int y = 0; y < countCellInColumn; y++) {
        for(int x = 0; x < countCellInRow; x++) {
        if(images[y][x] != null) {
            int pozX = model.getCellInRowAndColumn(x, y).CENTER_X 
                - images[y][x].getWidth(null) / 2;
            int pozY = model.getCellInRowAndColumn(x, y).CENTER_Y
                - images[y][x].getHeight(null);
            g.drawImage(images[y][x], pozX, pozY, null);
        }
        }
    }
    }
 
}
Перемещаю я вот этот компонент:
package viewPG;
 
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import java.io.File;
import javax.imageio.ImageIO;
import modelPG.IMove;
import modelPG.Model;
 
class Person extends JPanel implements IMove{
 
    private Image image; 
 
    Person(Model model) {
    try {
        image = ImageIO.read(new File(View.path + "wizard.png"));
    } catch(Exception e) {
    }
    
    setSize(model.getWidthPerson(), model.getHeightPerson());
    model.addMoveListener(this);
    }
 
    public void paintComponent(Graphics g) {
    g.drawImage(image, 0, 0, null);
    } 
 
    //метод ниже вызывается из другого потока. Он и ответственен за перемещение компонента.
    public void newPoz(int x, int y) {
    setLocation(x, y);
    }
 
}
package viewPG;
 
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import java.io.File;
import javax.imageio.ImageIO;
import modelPG.Model;
 
public class View extends JPanel{
 
    private Model model;
    private Container container;
    private Map map;
    private Person person;
    static String path = "D:/JAVA/myExperiments/graphicsPG/mapPG/src/graphicsPG/";
 
    public View(Model model, Container container) {
    this.model = model;
    this.container = container;
 
    map = new Map(model);
    person = new Person(model);
 
    container.add(map);
    container.add(person);
    }
 
}
Думал, что причина ошибки в в том, что метод
    public void newPoz(int x, int y) {
        setLocation(x, y);
    }
делает обновление компонента не из swing потока. Переписал так:
    public void newPoz(int x, int y) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
        setLocation(x, y);
        }
    });
    }
Однако проблемы остались, ничего не изменилось. Скажите пожалуйста - что я ещё не учёл?
Решил проблему с перемещением всех объектов: убрал менеджер компоновки. Теперь перемещается только экземпляр класса Person. Однако проблема с остающимся после него следа из наслоенных копий осталась.

Решение задачи: «Разработка игры. Многократное копирование изображения»

textual
Листинг программы
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }

Оцени полезность:

14   голосов , оценка 4.214 из 5