Java 仅绘制一次图像,无需重新绘制

Java 仅绘制一次图像,无需重新绘制,java,swing,animation,graphics,paintcomponent,Java,Swing,Animation,Graphics,Paintcomponent,我用java编写了简单的动画,再次调用了paintComponent(Graphics g)方法 问题是,我在背景中画的画是随机生成的。因此每次调用repaint()时,它都会更改 它是通过绘制矩形生成的,所以我需要图形处理程序 我怎样才能解决这个问题 public void paintComponent(Graphics g) { landscape = new Landscape(g); // landscape - attribute //... } 因此多次调用构造函数:

我用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
公共类景观
{
公共景观(图g)
{
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(新颜色(92163,99));
Random rand=新的Random();
int first=rand.nextInt((800-1)+1)+1;
g2d.fillRect(0800-first,1,first);
int d=第一个%2;
如果(d==0)d=-1;
对于(int i=1;i 950){
d=-(d);
}
如果(d==-1){
第一+=1;
}否则{
第一-=1;
}
g2d.fillRect(i,800-first,1,first);
}
}
}//末端景观

每次所有点都改变。

将矩形的构造与矩形的绘制分开

在构造函数中构造矩形,并在draw方法中绘制矩形

这是你的景观课,重新安排

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
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
公共类景观{
列表矩形;
公共景观(){
矩形=新的ArrayList();
Random rand=新的Random();
int first=rand.nextInt((800-1)+1)+1;
添加(新的矩形(0800-第一个,1,第一个));
int d=第一个%2;
如果(d==0)
d=-1;
对于(int i=1;i 950){
d=-(d);
}
如果(d==-1){
第一+=1;
}否则{
第一-=1;
}
添加(新的矩形(i,800-first,1,first));
}
}
公共空间绘制(图g){
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(新颜色(92163,99));
用于(矩形r:矩形){
g2d.fillRect(r.x,r.y,r.宽度,r.高度);
}
}
}//末端景观

将矩形的构造与矩形的绘图分开

在构造函数中构造矩形,并在draw方法中绘制矩形

这是你的景观课,重新安排

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
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
公共类景观{
列表矩形;
公共景观(){
矩形=新的ArrayList();
Random rand=新的Random();
int first=rand.nextInt((800-1)+1)+1;
添加(新的矩形(0800-第一个,1,第一个));
int d=第一个%2;
如果(d==0)
d=-1;
对于(int i=1;i 950){
d=-(d);
}
如果(d==-1){
第一+=1;
}否则{
第一-=1;
}
添加(新的矩形(i,800-first,1,first));
}
}
公共空间绘制(图g){
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(新颜色(92163,99));
用于(矩形r:矩形){
g2d.fillRect(r.x,r.y,r.宽度,r.高度);
}
}
}//末端景观

发布您的课程代码。所以我们可以帮你。布尔标志不起作用。这幅画根本没出现。你怎么试过的?private int a=0;然后如果(a==0){scape=new scape(g);a=1;}println在if中只工作一次,那么它应该工作……但是它不会显示任何东西发布类代码。所以我们可以帮你。布尔标志不起作用。这幅画根本没出现。你怎么试过的?private int a=0;然后如果(a==0){scape=new scape(g);a=1;}println在if中只工作一次,那么它应该工作……但它不显示任何内容,或者同样地,将背景渲染为
BufferedImage
并在
draw
方法中简单地将其绘制为idea@MadProgrammer或在
JLabel
中显示该图像,并在图像更改时调用
label.repaint()
。或者,同样地,将背景渲染为
buffereImage
并简单地使用
draw
方法将其绘制为idea@MadProgrammer或在
JLabel
中显示该图像,并在图像更改时调用
label.repaint()