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 的构造函数中创建,它的大小会在那里定义,而不是每次绘制它时。
我正在做一个练习继承的实验室,其中我们将创建一个水平椭圆作为 "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 的构造函数中创建,它的大小会在那里定义,而不是每次绘制它时。