У меня есть много объектов, которые хочу отрисовать на экран. Если дело обстоит в обычной отрисовке, то тут никаких проблем не возникает, все объекты отрисовываются моментально, глаз не успевает даже заметить что произошло, но когда мне требуется часто обновлять view (JPanel), то тут возникает проблема:
некоторые объекты начинают пропадать на долю секунды и снова появляться, при чём неважно, стоит ли объект на месте или двигается.
Для обновления я использовал данную функцию:
public void slowMove(int x, int y) {
int currentX = this.x;
int currentY = this.y;
Thread thread = new Thread(() -> {
while (this.x != currentX + x) {
this.x = 4 * x / Model.FIELD_CELL_SIZE + this.x;
try {
Thread.sleep(16);
} catch (InterruptedException e) {
e.printStackTrace();
}
update();
}
while (this.y != currentY + y) {
this.y = 4 * y / Model.FIELD_CELL_SIZE + this.y;
try {
Thread.sleep(16);
} catch (InterruptedException e) {
e.printStackTrace();
}
update();
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Объекты я получаю из сета объектов и в цикле for отрисовываю их по одному.
public void paintComponent(Graphics g) {
g.setColor(new Color(0x000000));
g.fillRect(0, 0, 500, 500);
GameObjects gameObjects = view.getGameObjects();
if (gameObjects != null)
for (GameObject gameObject : gameObjects.getAll()) {
gameObject.draw(g);
}
super.paintComponent(g);
}
Вот пример draw классов:
@Override
public void draw(Graphics graphics) {
Graphics2D g2 = (Graphics2D) graphics;
g2.drawImage(image, x, y, width, height, null);
}
Используй двойную буферизацию, сначала нарисуй все объекты на картинке(BufferedImage напр.), а потом уже ее.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости