我正在研究实验继承,我们将创建一个水平椭圆作为“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);
}
}
答案 0 :(得分:3)
因为当我将框架拖得更大时,系统会一遍又一遍地调用draw方法,
正确,调整框架大小时,所有组件都会重新绘制。
有什么建议吗?
绘画代码应基于您的类的属性。如果您希望绘画是固定大小,那么您可以定义控制绘画的属性,并在绘画方法之外设置这些属性。
例如,您永远不会在绘制方法中调用Random.nextInt(...)。这意味着每次重新绘制组件时,该值都会更改。
因此Shape应该在类的构造函数中创建,并且它的大小将在那里定义,而不是每次绘制它。