⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 element.java

📁 JAVA 2入门经典 练习答案
💻 JAVA
字号:
import java.awt.Color;
import java.awt.Shape;
import java.awt.Point;
import java.awt.Graphics2D;
import java.awt.Font;

import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.AffineTransform;
import java.awt.geom.PathIterator;

import java.text.DecimalFormat;

public abstract class Element {
  public Element(Color color) {
    this.color = color;  
  }

  public Color getColor() {
    return color;  
  }

  // Set or reset highlight color
  public void setHighlighted(boolean highlighted) {
    this.highlighted = highlighted;
  }

  public Point getPosition() {  
    return position;  
  }

  protected void draw(Graphics2D g2D, Shape element) {
    g2D.setPaint(highlighted ? Color.MAGENTA : color);  // Set the element color
    AffineTransform old = g2D.getTransform();      // Save the current transform
    g2D.translate(position.x, position.y);         // Translate to position
    g2D.rotate(angle);                              // Rotate about position
    g2D.draw(element);                             // Draw the element
    g2D.setTransform(old);                         // Restore original transform
  }

  protected java.awt.Rectangle getBounds(java.awt.Rectangle bounds) { 
    AffineTransform at = AffineTransform.getTranslateInstance(position.x, 
                                                              position.y);
    at.rotate(angle);
    return at.createTransformedShape(bounds).getBounds();
  }

  public void move(int deltax, int deltay) {
    position.x += deltax;
    position.y += deltay;
  } 

  public void rotate(double angle) {  
  this.angle += angle;  }

  public abstract java.awt.Rectangle getBounds();
  public abstract void modify(Point start, Point last);
  public abstract void draw(Graphics2D g2D);
  public abstract String getInfo();
  
  protected Color color;                           // Color of a shape
  protected boolean highlighted = false;           // Highlight flag
  final static Point origin = new Point();         // Point 0,0
  protected Point position;                        // Element position
  protected double angle = 0.0;                    // Rotation angle

  // Decimalformat object for use in getInfo() method implementations
  protected DecimalFormat form = new DecimalFormat("#,###.#");
  
  // Nested class defining a line
  public static class Line extends Element {
    public Line(Point start, Point end, Color color) {
      super(color);
      position = start;
      line = new Line2D.Double(origin, new Point(end.x - position.x, 
                                                 end.y - position.y));
    }

  public String getInfo() {
    StringBuffer info = new StringBuffer("Element Type: ");
    return info.append("Line\n").append("Position: x = ").append(position.x)
    .append(" y = ").append(position.y).append('\n')
               .append("Length: ").append(form.format(line.getP1().distance(line.getP2()))).append('\n')
               .append("Angle: ").append(form.format(angle+Math.atan(line.getY2()/line.getX2())))
               .append(" radians").append('\n').toString();
  }

    public java.awt.Rectangle getBounds() {
      return getBounds(line.getBounds());    
    }

    public void modify(Point start, Point last) {
      line.x2 = last.x - position.x;
      line.y2 = last.y - position.y;
    }

    public void draw(Graphics2D g2D)  {
      draw(g2D, line);                              // Call base draw method
    }

    private Line2D.Double line;
  }

  // Nested class defining a rectangle
  public static class Rectangle extends Element {
    public Rectangle(Point start, Point end, Color color) {
      super(color);
      position = new Point(Math.min(start.x, end.x),
                           Math.min(start.y, end.y));
      rectangle = new Rectangle2D.Double(origin.x,
                                         origin.y,
                                         Math.abs(start.x - end.x),     // Width
                                         Math.abs(start.y - end.y));    // & height 
    }

  public String getInfo() {
    StringBuffer info = new StringBuffer("Element Type: ");
    return info.append("Rectangle\n").append("Position: x = ").append(position.x)
               .append(" y = ").append(position.y).append('\n')
               .append("Width: ").append(form.format(rectangle.width))
               .append(" Height: ").append(form.format(rectangle.height)).append('\n')
               .append("Angle: ").append(form.format(angle)).append(" radians").toString();
  }

    public java.awt.Rectangle getBounds() { 
      return getBounds(rectangle.getBounds());  
    }

    public void modify(Point start, Point last) {
      position.x = Math.min(start.x, last.x);
      position.y = Math.min(start.y, last.y);
      rectangle.width = Math.abs(start.x - last.x);
      rectangle.height = Math.abs(start.y - last.y);
    }

    public void draw(Graphics2D g2D)  {
      draw(g2D, rectangle);                              // Call base draw method    
    }

    private Rectangle2D.Double rectangle;
  }

  // Nested class defining a circle
  public static class Circle extends Element {
    public Circle(Point center, Point circum, Color color) {
      super(color);
  
      // Radius is distance from center to circumference
      double radius = center.distance(circum);
      position = new Point(center.x - (int)radius,
                           center.y - (int)radius);
      
      circle = new Ellipse2D.Double(origin.x, origin.y,     // Position - top-left
                                    2.*radius, 2.*radius ); // Width & height
    }

    public String getInfo() {
      StringBuffer info = new StringBuffer("Element Type: ");
      return info.append("Circle\n").append("Position: x = ").append(position.x)
                 .append(" y = ").append(position.y).append('\n')
                 .append("Radius: ").append(form.format(circle.width/2.0)).toString();
    }

    public java.awt.Rectangle getBounds() { 
      return getBounds(circle.getBounds());  
    }

    public void modify(Point center, Point circum) {
      double radius = center.distance(circum);
      position.x = center.x - (int)radius;
      position.y = center.y - (int)radius;
      circle.width = circle.height = 2*radius;
    }

    public void draw(Graphics2D g2D)  {
      draw(g2D, circle);                              // Call base draw method    
    }

    private Ellipse2D.Double circle;
  }

  // Nested class defining a curve
  public static class Curve extends Element {
    public Curve(Point start, Point next, Color color) {
      super(color);
      curve = new GeneralPath();
      position = start;
      curve.moveTo(origin.x, origin.y);
      curve.lineTo(next.x - position.x,
                   next.y - position.y);

    }

  public String getInfo() {
    PathIterator iter = curve.getPathIterator(null);
    int pts = 0;
    while(!iter.isDone()) {
      ++pts;
      iter.next();
    }
    StringBuffer info = new StringBuffer("Element Type: ");
    return info.append("Curve\n").append("Position: x = ").append(position.x)
               .append(" y = ").append(position.y).append('\n')
               .append("Number of Points: ").append(pts).append('\n')
               .append("Angle: ").append(form.format(angle)).append(" radians").toString();
  }

    // Add another segment
    public void modify(Point start, Point next) {
      curve.lineTo(next.x - start.x,
                   next.y - start.y);
    }

    public java.awt.Rectangle getBounds() { 
      return getBounds(curve.getBounds());  
    }

    public void draw(Graphics2D g2D)  {
      draw(g2D, curve);                              // Call base draw method
    }

    private GeneralPath curve;
  }


  // Class defining text element
  public static class Text extends Element  {
    public Text(Font font, String text, Point position, Color color,
                                        java.awt.Rectangle bounds) {
      super(color);
      this.font = font;
      this.position = position;
      this.position.y -= (int)bounds.getHeight();
      this.text = text;
      this.bounds = new java.awt.Rectangle(origin.x, origin.y,
                                            bounds.width, bounds.height);
    }

  public String getInfo() {
    StringBuffer info = new StringBuffer("Element Type: ");
    return info.append("Text\n").append("Position: x = ").append(position.x)
               .append(" y = ").append(position.y).append('\n')
               .append("Angle: ").append(form.format(angle)).append(" radians").append('\n')
               .append("Font: ").append(font.getFontName()).append('\n')
               .append("Point Size: ").append(font.getSize()).toString();
  }

    public java.awt.Rectangle getBounds() {
      return getBounds(bounds);
    }

    public void draw(Graphics2D g2D)  {
      g2D.setPaint(highlighted ? Color.magenta : color);       // Set the line color
      Font oldFont = g2D.getFont();                // Save the old font
      g2D.setFont(font);                          // Set the new font

      AffineTransform old = g2D.getTransform();      // Save the current transform
      g2D.translate(position.x, position.y);         // Translate to position
      g2D.rotate(angle);                              // Rotate about position
      g2D.drawString(text, origin.x, origin.y+(int)bounds.getHeight());
      g2D.setTransform(old);                         // Restore original transform

      g2D.setFont(oldFont);                        // Restore the old font
    }

    public void modify(Point start, Point last) {
      // No code is required here, but we must supply a definition
    }

    private Font font;                             // The font to be used
    private String text;                           // Text to be displayed
    java.awt.Rectangle bounds;                      // The bounding rectangle
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -