2013-03-04 2 views
1

Итак, у меня есть задание для университета. Понятие заключалось в том, что мы должны были заполнить некоторые элементы иерархии классов. В основном это было то, что позволило нам рисовать разные формы.Проблемы с рисованием - рисование составной фигуры из других форм

Я могу успешно нарисовать каждую форму; где мне это нужно и насколько мне это нужно, как и требовалось ... в той части, с которой я столкнулся, это сложная иерархия.

В основном мы должны иметь новый класс Compound.java и простирающийся от мы должны иметь три других классов, House, tree и earth; каждый из которых должен взять объекты формы, которые мы создали (Rectangle, Square, Line, Oval и Circle), и нарисовать нужные изображения, обозначенные именем класса.

Где я столкнулся с проблемой в классе дома; например: я могу заставить его нарисовать один прямоугольник, но когда я попытаюсь заставить его рисовать второй прямоугольник после, он в основном забывает о первом и только рисует второй!

У нас не было практики с материалами Graphics, поэтому я не знаю никаких методов или чего-либо, что я могу вызвать для рисования, а затем продолжить в конструкторе House.

Я понимаю, почему он перезаписывает первый прямоугольник, когда House конструктор вызывается, она проходит через все вещи в конструкторе, а затем возвращается к Compound.java и рисует его с помощью метода draw(Graphics g) ....

Но я не знаю, как это исправить! Любая помощь будет оценена ... это должно быть завтра.

Вот весь код:

Shape.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); 

    } 


} 
+0

Важная информация, стена текста! –

+0

@ Danny Beckett lol да извините ....Я так долго работал над этим, и я очень раздражаюсь, потому что я не могу понять, что я делаю неправильно, и, похоже, не могу получить помощь нигде ... – MicroMumbler

+0

Я отредактировал ваш вопрос так это немного легче читать ... может быть, вам повезет больше! –

ответ

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?

Смежные вопросы