1

それで、大学の課題があります。コンセプトは、いくつかのクラス階層を完成させることでした。基本的には、いろいろな形を描けるようにするためのものでした。

それぞれの形を上手に描くことができます。必要な場所と必要な大きさ、必要に応じて... 私が問題を抱えている部分は、この複合階層です。

基本的に、 と呼ばれる新しいクラスがあり、そこから拡張されて、 、、および;Compound.javaという 3 つの他のクラスがあるはずです。それぞれが作成したシェイプ オブジェクト (Rectangle、Square、Line、Oval、Circle) を受け取り、クラス名で示されるように必要な画像を描画します。Housetreeearth

私が問題を抱えているのは家のクラスです。例: 1 つの長方形を描画することはできますが、2 つ目の長方形を描画しようとすると、基本的に最初のものを忘れて 2 つ目だけを描画します!

Houseグラフィックスについては練習したことがないので、描画してコンストラクターで続行するために呼び出すことができるメソッドや何かを知りません。

コンストラクターが呼び出されたときに最初の四角形を上書きする理由を理解しています。Houseコンストラクター内のすべてのものを実行し、次に戻ってメソッドCompound.javaを使用して描画しdraw(Graphics g)ます....

でも直し方がわからない!助けていただければ幸いです... 明日が期限です。

すべてのコードは次のとおりです。

シェイプ.java:

import java.awt.*;

public abstract class Shape {
    int initX, initY;
    Color fillColour;

    public Shape() {
        initX = 0;
        initY = 0;
    }

    public Shape(int x, int y) {
        initX = x;
        initY = y;
    }

    public void setInitX (int x) {
        initX = x;
    }

    public void setInitY (int y) {
        initY = y;
    }

    public abstract void draw(Graphics g);
    public abstract double Area();
    public abstract double Perimeter();

    public void Move(int deltaX, int deltaY){
        //future work
    }

}

ClosedShape.java :

import java.awt.Graphics;

public abstract class ClosedShape extends Shape {
    boolean polygon;
    int numPoints;
    int[] xVertices;
    int[] yVertices;
    int x,y,width, height;

    public ClosedShape(boolean isPolygon, int numPoints) {
        super(0,0);
        this.polygon = isPolygon;
        this.numPoints = numPoints;
    }

    public ClosedShape(boolean isPolygon, int numPoints, int[] x, int[] y) {
        super(x[0],y[0]);
        this.polygon = isPolygon;
        if (isPolygon) {
            this.numPoints = numPoints;
            xVertices = new int[numPoints]; // error check?  if x.length == numPoints
            for (int i = 0; i < x.length; i++) { // make copy of array: why?
                xVertices[i] = x[i];
            }
            yVertices = new int[numPoints]; // error check?  if y.length == numPoints
            for (int i = 0; i < y.length; i++) { // make copy of array
                    yVertices[i] = y[i];
            }
        }
        else { // its an oval - define bounding box
            this.numPoints = 4;
            this.x = x[0];
            this.y = y[0];
            width = x[1];
            height = y[1];
        }
    }

    public void setXYCoords(int[] x, int[] y){
        this.xVertices = x;
        this.yVertices = y;
    }

    // Gives access to the width attribute
    public void setWidth(int width){
        this.width = width;
    }

    // Gives access to the height attribute
    public void setHeight(int height) {
        this.height = height;
    }

    public void draw(Graphics g) {
        if (polygon) {
            g.drawPolygon(xVertices, yVertices, numPoints);
        }
        else {
            g.drawOval(x, y, width, height);
        }

    }

    public abstract double Area();
    public abstract double Perimeter();








}

Rectangle.java :

public class Rectangle extends ClosedShape
{

    public Rectangle(int x, int y, int width, int height)
    {
        super(true, 4);

        setWidth(width);
        setHeight(height);

        int [] arrayX = new int[4];
        arrayX[0] = x;
        arrayX[1] = (x+width);
        arrayX[2] = (x+width);
        arrayX[3] = x;

        int [] arrayY = new int[4];
        arrayY[0] = y;
        arrayY[1] = y;
        arrayY[2] = y+height;
        arrayY[3] = y+height;

        setXYCoords(arrayX, arrayY);

    }

    public double Area()
    {
       return 0;
    }

    public double Perimeter()
    {
        return 0;
    }

}

Compound.java :

import java.awt.*;
import java.awt.Graphics;


public class Compound
{
    boolean polygon;
    int[] xVertices;
    int[] yVertices;
    int initX, initY;
    Color fillColour;

    public void setXYCoords(int[] x, int[] y)
    {
        this.xVertices = x;
        this.yVertices = y;
    }

    public void draw(Graphics g)
    {
        if (polygon) {
            g.drawPolygon(xVertices, yVertices, 4);
        }
        else {
            g.drawOval(1, 1, 1, 1);
        }

    }

}

House.java :

import java.awt.*;
import java.awt.Graphics;


public class House extends Compound
{

    public House(int x, int y, int width, int height)
    {

        int [] arrayX = new int[4];
        arrayX[0] = x;
        arrayX[1] = (x+width);
        arrayX[2] = (x+width);
        arrayX[3] = x;

        int [] arrayY = new int[4];
        arrayY[0] = y;
        arrayY[1] = y;
        arrayY[2] = y+height;
        arrayY[3] = y+height;

        setXYCoords(arrayX, arrayY);
        this.polygon = true;

        Rectangle house = new Rectangle(x, y, width, height);

        int [] arrayXTwo = new int[4];
        arrayXTwo[0] = x+(width/4);
        arrayXTwo[1] = x+(2*(width/4));
        arrayXTwo[2] = x+(2*(width/4));
        arrayXTwo[3] = x+(width/4);

        int [] arrayYTwo = new int[4];
        arrayYTwo[0] = y+(height/4);
        arrayYTwo[1] = y+(height/4);
        arrayYTwo[2] = y+height;
        arrayYTwo[3] = y+height;

        setXYCoords(arrayXTwo, arrayYTwo);
        this.polygon = true;

        Rectangle door = new Rectangle(x, y, width, height);

    }


}
4

1 に答える 1

0

サンプルコードから、Compoundクラスに形状を「追加」する方法はありません。あなたの説明から、Compound形状の「コンテナ」である必要があります。さらに何か...

public class Compound
{
    private List<Shape> shapes;

    public Compound() {
        shapes = new ArrayList<Shape>(25);
    }

    public void addShape(Shape shape) {
        shapes.add(shape);
    }

    public Iterable<Shape> getShapes() {
        return shape;
    }

    public void draw(Graphics g) {
        for (Shape shape : shapes) {
            shape.draw(g);
        }
    }
}

ここで、 を形状自体に対して定義Colorする必要がある と関連付けるのに最適な場所を決定する必要があります。Shapeつまり、形状を再利用することはできません。それともCompound形で?

于 2013-03-04T04:47:11.887 に答える