0

我正在创建一个 JFrame 并绘制大小为 1x1 的矩形,每个矩形都是来自随机生成器的 RGB 值的随机颜色。当我运行代码时,框架会绘制所有矩形,但几秒钟后,框架中的矩形会发生变化。

矩形类:

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");
   }
}

“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 看它是否调用了矩形类两次,但我不知道为什么!任何人都可以帮忙吗?

4

1 回答 1

2

每当 Swing 决定需要重绘某些东西时(例如,当窗口被调整大小、最小化、未覆盖时)或当您显式调用 repaint() 时,都会调用 paintComponent() 方法。因此不要将初始化代码放在paintComponent() 中。顺便说一句,不要把任何需要很长时间的东西放在paintComponent()中,因为你在那里所做的所有计算都会“丢失”

例如,您可以将矩形渲染到缓存的 BufferedImage(如 Andrew Thompson 建议的那样),或者您可以将颜色保存在二维数组中。

于 2013-01-17T14:00:26.777 回答