Java - 学习继承,使用Graphics2D,调整框架大小时重绘对象

Java - Learning inheritance, using Graphics2D, object is redrawn when resizing the frame

我正在做一个练习继承的实验室,其中我们将创建一个水平椭圆作为 "Shape1",然后创建一个扩展 Shape1 的 "Shape2",它绘制它的超类 Shape1,然后在顶部绘制一个垂直椭圆以创建一个新的外观形状。该形状在继承和外观方面显示良好(color/location 等)但是当 运行 程序时,框架宽度设置为 1000,高度设置为 700,但是如果我拖动边角处画框以放大它,当我不断将框拖得更大时,形状会一遍又一遍地绘制。理想情况下,形状应该保持在相对于框架尺寸的位置。我认为发生这种情况是因为当我将框架拖得更大时,系统会一遍又一遍地调用 draw 方法,但我不确定这是在哪里发生的或如何修复它。有什么建议吗?

全部类显示如下:

形状 1:

   public class Shape1 {
   private double x, y, r;
   protected Color col;
   private Random randGen = new Random();

   public Shape1(double x, double y, double r) {
      this.x = x;
      this.y = y;
      this.r = r;
      this.col = new Color(randGen.nextFloat(), randGen.nextFloat(), randGen.nextFloat());
   }

   public double getX() {
      return this.x;
   }

   public double getY() {
      return this.y;
   }

   public double getR() {
      return this.r;
   }

   public void draw(Graphics2D g2){
      //Create a horizontal ellipse
      Ellipse2D horizontalEllipse = new Ellipse2D.Double(x - 2*r, y - r, 4 * r, 2 * r);

      g2.setPaint(col);
      g2.fill(horizontalEllipse);
   }

}

形状 2:

public class Shape2 extends Shape1 {

   public Shape2(double x, double y, double r) {
      super(x, y, r);
   }


   public void draw(Graphics2D g2) {
       //Create a horizontal ellipse
       Ellipse2D verticalEllipse = new Ellipse2D.Double(super.getX() - super.getR(),
                                                           super.getY() - 2*super.getR(),
                                                           2 * super.getR(), 4 * super.getR());

       super.draw(g2);
       g2.fill(verticalEllipse);
   }
}

形状组件:

public class ShapeComponent extends JComponent {

   //Instance variables here
   private Random coordGen = new Random();
   private final int FRAME_WIDTH = 1000;
   private final int FRAME_HEIGHT = 700;

   public void paintComponent(Graphics g) {
      Graphics2D g2 = (Graphics2D) g;

      Shape2 myShape = new Shape2(1 + coordGen.nextInt(FRAME_WIDTH), 1 + coordGen.nextInt(FRAME_HEIGHT), 20);
      //Draw shape here
      myShape.draw(g2);
   }
}

ShapeViewer(创建 JFrame 的地方):

public class ShapeViewer {
   public static void main(String[] args) {

      final int FRAME_WIDTH = 1000;
      final int FRAME_HEIGHT = 700;

      //A new frame
      JFrame frame = new JFrame();

      frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
      frame.setTitle("Lab 5");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      ShapeComponent component = new ShapeComponent();
      frame.add(component);

      //We can see it!
      frame.setVisible(true);  
   }
}

because while I drag the frame larger, the draw method is being called over and over again by the system,

正确,调整框架大小时会重新绘制所有组件。

Any suggestions?

绘画代码应根据您的属性class。如果您希望绘画是固定大小,那么您定义控制绘画的属性并在绘画方法之外设置这些属性。

例如,您永远不会在绘画方法中调用 Random.nextInt(...)。这意味着每次重新绘制组件时该值都会更改。

所以 Shape 应该在 class 的构造函数中创建,它的大小会在那里定义,而不是每次绘制它时。