我正在创建一个JFrame并绘制1x1大小的矩形,这些矩形是来自随机生成器的RGB值的随机颜色。当我运行代码时,框架会绘制所有矩形,但几秒钟后,框架中的矩形会发生变化。
Rectangle类:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.Random;
import javax.swing.*;
public class RandomRect extends JComponent
{
private static final long serialVersionUID = 1L;
public void paintComponent(Graphics g)
{
Random rand = new Random();
Graphics2D g2 = (Graphics2D) g;
for(int y=1; y<601; y++)
{
for(int x=1; x<1201; x++)
{
float red = rand.nextFloat();
float green = rand.nextFloat();
float blue = rand.nextFloat();
Color randomColor = new Color(red, green, blue);
Rectangle box = new Rectangle(x, y, 1, 1);
g2.setColor(randomColor);
g2.fill(box);
}
}
System.out.println("Finished draw");
}
}
“完成抽奖”正在打印两次。
RectViewer类:
import java.awt.Color;
import javax.swing.*;
public class RectViewer
{
public static void main(String[] args)
{
JFrame frame = new JFrame ();
frame.setSize(1200,600);
frame.setTitle("Using the Rectangle Class");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.white);
RandomRect rect = new RandomRect();
frame.add(rect);
frame.setVisible(true);
}
}
我扔了一个println,看它是否调用了两次矩形类,但是我不知道为什么!有人可以帮忙吗?
答案 0 :(得分:2)
只要Swing决定需要重新绘制某些内容(例如,当窗口调整大小,最小化,未覆盖)或显式调用repaint()时,就会调用paintComponent()方法。因此,不要将初始化代码放在paintComponent()中。顺便说一句,不要在paintComponent()中放置任何需要很长时间的东西,因为你在那里做的所有计算都会“丢失”
例如,您可以将矩形渲染为缓存的BufferedImage(如Andrew Thompson建议的那样),或者您可以将颜色保存为二维数组。