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

时间:2015-10-16 19:21:47

标签: java swing inheritance jframe graphics2d

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

所有课程均显示如下:

Shape1:

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

}

Shape2:

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

ShapeComponent:

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

1 个答案:

答案 0 :(得分:3)

  

因为当我将框架拖得更大时,系统会一遍又一遍地调用draw方法,

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

  

有什么建议吗?

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

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

因此Shape应该在类的构造函数中创建,并且它的大小将在那里定义,而不是每次绘制它。