2013-10-27 2 views
0

Я работал над проблемой, когда у меня возникала проблема с литой при попытке бросить из Shape в Area (см. Предыдущее сообщение cast exception question). Теперь кажется, что моя форма, которая создается, создается неправильно. Вместо публикации всего моего исходного кода здесь я привязываю ссылку на все исходные файлы here.Java-вызов для создания новой области не создает форму?

По существу я создаю форму следующим образом со стандартным вызовом

YingYang shape = new YingYang(); 
shape = shape.moveTo(x, y); 
shape = shape.scaleBy(size); 
shape.setColor(getNextColor()); 

и призывы к классу зоны являются:

public YingYang() 
{ 
    Area mainCircle = new Area(new Ellipse2D.Double(...) 
    ... 
    yingYang.add(mainCircle); 
} 

MoveTo вызов:

public YingYang moveTo(double x, double y) 
{ 

    at.translate(x, y); 
    at.setToTranslation(x, y); 
    yingYang.transform(at); 
    return new YingYang(at.createTransformedShape(yingYang)); 
} 

ScaleBy:

public YingYang scaleBy(double scale) 
{ 
    double cx = this.getBounds2D().getCenterX(); 
    double cy = this.getBounds2D().getCenterY(); 

    at.translate(cx, cy); 
    at.setToTranslation(cx, cy); 
    at.scale(scale, scale);  
    at.translate(-cx, -cy); 
    return new YingYang(at.createTransformedShape(yingYang)); 
} 

Когда я называю paintComponent() в моей чертежной панели:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    for(YingYang s : shapes) 
    {  
     System.out.println(s.getBounds2D()); 
     g2.setColor(s.getColor()); 
     g2.fill(s); 
    } 
} 

В оператор печати печатает:

java.awt.geom.Rectangle2D$Double[x=0.0,y=0.0,w=0.0,h=0.0] 

Я в недоумении ... Любые идеи?

+0

Я вижу, что YingYang расширяет область, но также содержит поле под названием yingYang, которое также является объектом Area. Вы имеете в виду getBounds2D на поле? Может быть, мне что-то не хватает, потому что я действительно просто просматривал код, но кажется немного лишним расширить класс, а затем, главным образом, использовать поле, которое принадлежит суперклассу. В любом случае, возможно, что вы хотите сделать, это переопределить getBounds2D в YingYang, чтобы он возвращал yingYang.getBounds2D? – Radiodef

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

1

Похоже, вы объединили обе мои рекомендации в один кусок кода. Если вы собираетесь использовать переменную yingYang, тогда вы должны реализовать форму в классе. Однако, если вы собираетесь расширить область, вам нужно удалить переменную yingYang и использовать класс в качестве области, например: yingYang.add (mainCircle); становится add (mainCircle); ... существенно удаляет все ссылки переменной yingYang.

Так что вместо переменной «yingYang» вы используете «это». heres - это модифицированная версия вашего класса YingYang с удалением ссылок.

import java.awt.Color; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Area; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.PathIterator; 
import java.awt.geom.Point2D; 
import java.awt.geom.Rectangle2D; 

public class YingYang extends Area 
{ 
    AffineTransform at = new AffineTransform(); 
    private boolean movingRight = true; 
    private boolean movingUp = true; 
    private Color color = Color.BLACK; 
    private int dx = 10, dy = 10; 

    public YingYang(Shape shape) 
    { 
     super(shape); 
    } 


    public YingYang() 
    { 

     // Construct the Outer Circle & Lower Dot 
     Area mainCircle = new Area(new Ellipse2D.Double(-210, -210, 420, 420)); 
     Area lowerDot = new Area(new Ellipse2D.Double(-10, 90, 40, 40)); 
     mainCircle.subtract(lowerDot); 

     // Begin Construction of the whit side of symbol 
     Area whiteSide = new Area(new Ellipse2D.Double(-200, -200, 400, 400)); 
     Area rect = new Area(new Rectangle2D.Double(0, -200, 200, 400)); 
     whiteSide.subtract(rect); 

     // Construct the upper white Circle 
     Area upperCircle = new Area(new Ellipse2D.Double(-100, -200, 200, 200)); 
     whiteSide.add(upperCircle); 

     // Construct the Upper Dot 
     Area upperDot = new Area(new Ellipse2D.Double(-10, -110, 40, 40)); 
     whiteSide.subtract(upperDot); 

     // Remove the lower circle portion 
     Area lowerCircle = new Area(new Ellipse2D.Double(-100, 0, 200, 200)); 
     whiteSide.subtract(lowerCircle); 


     // Add Main Circle 
     add(mainCircle); 
     // Subtract the white side 
     subtract(whiteSide); 

    } 

    //------------------------ Methods ----------------------------------------- 

    /** 
    * Sets this shapes color 
    * (must call getColor before drawing this shape) 
    * @param color 
    */ 
    public void setColor(Color color) 
    { 
     this.color = color; 
    } 

    /** 
    * Gets this shapes current color 
    * @return color 
    */ 
    public Color getColor() 
    { 
     return this.color; 
    } 

    /** 
    * Determines if the shape is moving left to right 
    * @return - boolean 
    */ 
    public boolean isMovingRight() 
    { 
     return movingRight; 
    } 

    /** 
    * Determines if the shape is moving from down to up 
    * @return - boolean 
    */ 
    public boolean isMovingUp() 
    { 
     return movingUp; 
    } 

    /** 
    * Changes the Horizontal Path that this shape is traveling 
    */ 
    public void changeHorizonalMovement() 
    { 
     if(isMovingRight()) 
     { 
      movingRight = false; 
     } 
     else 
     { 
      movingRight = true; 
     } 
    } 

    /** 
    * Changes the Vertical Path that this shape is traveling 
    */ 
    public void changeVerticalMovement() 
    { 
     if(isMovingUp()) 
     { 
      movingUp = false; 
     } 
     else 
     { 
      movingUp = true; 
     } 
    } 

    /** 
    * Sets the direction of the Horizontal Path of this shape 
    * true = left to right : false = right to left 
    * @param dir - boolean 
    */ 
    public void setHorizonalMovement(boolean dir) 
    { 
     this.movingRight = dir; 
    } 

    /** 
    * Sets the direction of the Vertical Path of this shape 
    * true = down to up : false = up to down 
    * @param dir - boolean 
    */ 
    public void setVerticalMovement(boolean dir){ 
     this.movingUp = dir; 
    } 

    /** 
    * Moves the current shape by the amount x,y 
    * @param x - double 
    * @param y - double 
    */ 
    public YingYang moveTo(double x, double y) 
    { 

     at.translate(x, y); 
     at.setToTranslation(x, y); 
     transform(at); 
     return new YingYang(at.createTransformedShape(this)); 
    } 

    /** 
    * Rotate this shape 
    * @param theta - amount to rotate shape by 
    * @return 
    */ 
    public YingYang rotate(double theta) 
    { 
     double cx = getBounds2D().getCenterX(); 
     double cy = getBounds2D().getCenterY(); 

     at.translate(cx, cy); 
     at.setToTranslation(cx, cy); 
     at.rotate(Math.toRadians(theta)); 
     at.translate(-cx, -cy); 
     return new YingYang(at.createTransformedShape(this)); 
    } 

    public YingYang moveToAndRotate(double x, double y, double theta) 
    { 
     double cx = getBounds2D().getCenterX(); 
     double cy = getBounds2D().getCenterY(); 

     at.translate(cx, cy); 
     at.setToTranslation(cx, cy); 
     at.translate(x, y); 
     at.rotate(Math.toRadians(theta)); 
     at.translate(-cx, -cy); 
     return new YingYang(at.createTransformedShape(this)); 
    } 

    /** 
    * Scales this shape uniformly by the amount of scale 
    * about the origin 
    * @param scale - double 
    */ 
    public YingYang scaleBy(double scale) 
    { 
     double cx = this.getBounds2D().getCenterX(); 
     double cy = this.getBounds2D().getCenterY(); 

     at.translate(cx, cy); 
     at.setToTranslation(cx, cy); 
     at.scale(scale, scale);  
     at.translate(-cx, -cy); 
     return new YingYang(at.createTransformedShape(this)); 
    } 

    /** 
    * Rotates this shape theta degrees about the origin 
    */ 
    public YingYang rotate(Double theta) 
    { 
     double cx = this.getBounds2D().getCenterX(); 
     double cy = this.getBounds2D().getCenterY(); 

     at.translate(cx, cy); 
     at.setToTranslation(cx, cy); 
     at.rotate(Math.toRadians(theta));  
     at.translate(-cx, -cy); 
     return new YingYang(at.createTransformedShape(this)); 
    } 

    public int getDx() 
    { 
     return this.dx; 
    } 

    public void setDx(int x) 
    { 
     this.dx = x; 
    } 

    public int getDy() 
    { 
     return this.dy; 
    } 

    public void setDy(int y) 
    { 
     this.dy = y; 
    } 

} 
+0

Спасибо. Это больше похоже на то, как это следует делать с точки зрения расширения Района. Не уверен, что это будет выполняться для задания, поскольку мы давали инструкции по расширению класса формы, но форма была составлена ​​из области конструктивной геометрии. Я буду отмечать это как полностью, потому что он дает представление о том, как расширить класс. Но в то время как он исправил фундаментальные недостатки в моем коде, он открыл другие, например, не обновляя его в панели рисования. Я обновлю код в общей папке, если вы можете взглянуть и указать мне в правильном направлении. – jbolt

+0

@jbolt Мы можем обсудить подробности в чате http://chat.stackoverflow.com/rooms/139/java –

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

  • Нет связанных вопросов^_^