Нанесение изображения только один раз, без перекраски

Я написал простую анимацию в Java, с paintComponent(Graphics g) метод вызывается снова и снова.

Проблема в том, что картина, которую я рисую на заднем плане, генерируется случайным образом. Так что каждый раз, когда repaint() называется, это меняется.

Он генерируется путем рисования прямоугольников, поэтому мне нужен графический обработчик.

Как я могу решить эту проблему?

public void paintComponent(Graphics g)
{
   landscape = new Landscape(g); // landscape - attribute

   //...
}

Так что конструктор вызывается много раз:

public class Landscape 
{

    public Landscape(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;

        g2d.setColor(new Color(92, 163, 99));

        Random rand = new Random();
        int first = rand.nextInt((800 - 1) + 1) + 1;
        g2d.fillRect(0, 800 - first, 1, first);

        int d = first % 2;
        if(d == 0) d = -1;

        for(int i = 1; i <= 800; i++) {
            int choose = rand.nextInt((1000 - 1) + 1) + 1;

            if(choose > 950) {
                d = -(d);
            }

            if(d == -1) {
                first += 1;                
            } else {
                first -= 1;
            }

            g2d.fillRect(i, 800 - first, 1, first);
        }
    }

} // End Landscape

И каждый раз все точки меняются.

1 ответ

Решение

Отделите построение прямоугольников от рисунка прямоугольников.

Вы строите прямоугольники в конструкторе и рисуете прямоугольники в методе рисования.

Вот ваш класс Пейзаж, переставил.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Landscape {

    List<Rectangle> rectangles;

    public Landscape() {
        rectangles = new ArrayList<Rectangle>();

        Random rand = new Random();
        int first = rand.nextInt((800 - 1) + 1) + 1;
        rectangles.add(new Rectangle(0, 800 - first, 1, first));

        int d = first % 2;
        if (d == 0)
            d = -1;

        for (int i = 1; i <= 800; i++) {
            int choose = rand.nextInt((1000 - 1) + 1) + 1;

            if (choose > 950) {
                d = -(d);
            }

            if (d == -1) {
                first += 1;
            } else {
                first -= 1;
            }

            rectangles.add(new Rectangle(i, 800 - first, 1, first));
        }
    }

    public void draw(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(new Color(92, 163, 99));
        for (Rectangle r : rectangles) {
            g2d.fillRect(r.x, r.y, r.width, r.height);
        }
    }

} // End Landscape
Другие вопросы по тегам