0

私はJFrameを作成し、ランダムジェネレーターからのRGB値からのランダムな色であるサイズ1x1の長方形を描画しています。コードを実行すると、フレームはすべての長方形を描画しますが、数秒後にフレーム内の長方形が変わります。

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

「描き終わり」が2回印刷されています。

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

長方形クラスを2回呼び出すかどうかを確認するためにprintlnを投げましたが、その理由はわかりません! 誰でも助けることができますか?

4

1 に答える 1

2

paintComponent() メソッドは、Swing が何かを再描画する必要があると判断した場合 (たとえば、ウィンドウのサイズを変更したり、最小化したり、カバーを外したりする場合)、または明示的に repaint() を呼び出したときに呼び出されます。したがって、paintComponent() に初期化コードを入れないでください。ところで、paintComponent() に長時間かかるものを入れないでください。そこで行うすべての計算が「失われる」ためです。

たとえば、長方形をキャッシュされた BufferedImage にレンダリングしたり (Andrew Thompson が提案したように)、色を 2 次元配列に保存したりできます。

于 2013-01-17T14:00:26.777 に答える