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

📄 element.java

📁 Beginning Java 2, SDK 1.4 Edition Exercise Code samples for this book
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
      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 void writeObject(ObjectOutputStream out) throws IOException {
      out.writeDouble(circle.width);
    }

    private void readObject(ObjectInputStream in)
                 throws IOException, ClassNotFoundException {
      double width = in.readDouble();
      circle = new Ellipse2D.Double(0,0,width,width);
    }

    public void addElementNode(Document doc) {
      org.w3c.dom.Element circleElement = doc.createElement("circle");
 
      // Create the radius attribute and attach it to the <circle> node
      Attr attr = doc.createAttribute("radius");
      attr.setValue(String.valueOf(circle.width/2.0));
      circleElement.setAttributeNode(attr);
  
      // Create the angle attribute and attach it to the <circle> node
      attr = doc.createAttribute("angle");
      attr.setValue(String.valueOf(angle));
      circleElement.setAttributeNode(attr);

      // Append the <color> and <position> nodes as children
      circleElement.appendChild(createColorElement(doc));
      circleElement.appendChild(createPositionElement(doc));
 
      doc.getDocumentElement().appendChild(circleElement);
    }

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

    }

    // Create a Element.Curve object from a DOM Element
    // Curve has angle attribute. Content is <color>, <position>, <point>+
    public Curve(org.w3c.dom.Element xmlElement) {
      super(xmlElement);

      curve = new GeneralPath();
      curve.moveTo(origin.x, origin.y);
      org.w3c.dom.NodeList nodes = xmlElement.getElementsByTagName("point");
      for(int i = 0 ; i<nodes.getLength() ; i++)
        curve.lineTo(
                     (float)(Double.parseDouble(
           ((org.w3c.dom.Element)nodes.item(i)).getAttribute("x")) - position.x),
                     (float)(Double.parseDouble(
           ((org.w3c.dom.Element)nodes.item(i)).getAttribute("y")) - position.y));
    }

    // 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 void writeObject(ObjectOutputStream out) throws IOException {
      PathIterator iterator = curve.getPathIterator(new AffineTransform());
      Vector coords = new Vector();
      int maxCoordCount = 6;
      float[] temp = new float[maxCoordCount];       // Stores segment data

      int result = iterator.currentSegment(temp);    // Get first segment
      assert(result == iterator.SEG_MOVETO);
      iterator.next();                               // Next segment
      while(!iterator.isDone()) {                    // While we have segments
        result = iterator.currentSegment(temp);      // Get the segment data
        assert(result == iterator.SEG_LINETO);

        coords.add(new Float(temp[0]));              // Add x coordinate to Vector
        coords.add(new Float(temp[1]));              // Add y coordinate
        iterator.next();                             // Go to next segment
      }

    out.writeObject(coords);                         // Save the Vector
    }


    private void readObject(ObjectInputStream in)
                 throws IOException, ClassNotFoundException {
      Vector coords = (Vector)in.readObject();    // Read the coordinates Vector
      curve = new GeneralPath();                  // Create a path
      curve.moveTo(0,0);                          // Move to the origin
      float x, y;                                 // Stores coordinates

      for(int i = 0 ; i<coords.size() ; i += 2 ) { // For each pair of elements
        x = ((Float)coords.get(i)).floatValue();   // Get x value
        y = ((Float)coords.get(i+1)).floatValue(); // Get y value
        curve.lineTo(x,y);                         // Create a line segment
      }
    }

    public void addElementNode(Document doc) {
      org.w3c.dom.Element curveElement = doc.createElement("curve");
  
      // Create the angle attribute and attach it to the <curve> node
       Attr attr = doc.createAttribute("angle");
      attr.setValue(String.valueOf(angle));
      curveElement.setAttributeNode(attr);
   
      // Append the <color> and <position> nodes as children
      curveElement.appendChild(createColorElement(doc));
      curveElement.appendChild(createPositionElement(doc));
  
      // Get the defining points via a path iterator
      PathIterator iterator = curve.getPathIterator(new AffineTransform());
      int maxCoordCount = 6;                  // Maximum coordinates for a segment
      float[] temp = new float[maxCoordCount];           // Stores segment data
  
      int result = iterator.currentSegment(temp);        // Get first segment
      assert result == iterator.SEG_MOVETO;              // ... should be move to

      iterator.next();                                   // Next segment
      while(!iterator.isDone())   {                      // While we have segments
        result = iterator.currentSegment(temp);          // Get the segment data
        assert result == iterator.SEG_LINETO;            // Should all be lines
   
        // Create a <point> node and add it to the list of children
        curveElement.appendChild(createPointTypeElement(doc, "point",
                                  String.valueOf(temp[0]+position.x),
                                  String.valueOf(temp[1]+position.y)));
        iterator.next();                                   // Go to next segment
      }
  
      doc.getDocumentElement().appendChild(curveElement);
    }

    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);
    }

    // Create a Element.Text object from a DOM Element
    // Text has angle attribute. Content is <color>, <position>, <font>, <string>
    // <font> has attributes fontname, fontstyle, pointsize
    // fontstyle is "plain", "bold", "italic", or "bold-italic"
    // <string> content is text plus <bounds>
    public Text(org.w3c.dom.Element xmlElement) {
      super(xmlElement);

      // Get the font details
      org.w3c.dom.NodeList list = xmlElement.getElementsByTagName("font");
 

      org.w3c.dom.Element fontElement = (org.w3c.dom.Element)list.item(0);
      String styleStr = fontElement.getAttribute("fontstyle");
      int style = 0;
      if(styleStr.equals("plain"))
        style = Font.PLAIN;
      else if(styleStr.equals("bold"))
        style = Font.BOLD;
      else if(styleStr.equals("italic"))
        style = Font.ITALIC;
      else if(styleStr.equals("bold-italic"))
        style = Font.BOLD + Font.ITALIC;
      else
        assert false;
 
      font = new Font(fontElement.getAttribute("fontname"), style,
                      Integer.parseInt(fontElement.getAttribute("pointsize")));    

      // Get string bounds
      list = xmlElement.getElementsByTagName("bounds");
      org.w3c.dom.Element boundsElement = (org.w3c.dom.Element)list.item(0);
      
      this.bounds = new java.awt.Rectangle(origin.x, origin.y,
                          Integer.parseInt(boundsElement.getAttribute("width")),
                          Integer.parseInt(boundsElement.getAttribute("height")));
      
      // Get the string
      list = xmlElement.getElementsByTagName("string");
      org.w3c.dom.Element string = (org.w3c.dom.Element)list.item(0);
      list = string.getChildNodes();

     StringBuffer textStr = new StringBuffer();
     for(int i = 0 ; i<list.getLength() ; i++)
        if(list.item(i).getNodeType()==org.w3c.dom.Node.TEXT_NODE)
          textStr.append(((org.w3c.dom.Text)list.item(i)).getData());

     text = textStr.toString().trim();
   }  

    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
    }

    public void addElementNode(Document doc) {
      org.w3c.dom.Element textElement = doc.createElement("text");
 
      // Create the angle attribute and attach it to the <text> node
      Attr attr = doc.createAttribute("angle");
      attr.setValue(String.valueOf(angle));
      textElement.setAttributeNode(attr);
     
      // Append the <color> and <position> nodes as children
      textElement.appendChild(createColorElement(doc));
      textElement.appendChild(createPositionElement(doc));
   
      // Create and apppend the <font> node 
      org.w3c.dom.Element fontElement = doc.createElement("font");
      attr = doc.createAttribute("fontname");
      attr.setValue(font.getName());
      fontElement.setAttributeNode(attr);
  
      attr = doc.createAttribute("fontstyle");
      String style = null;
      int styleCode = font.getStyle();
      if(styleCode == Font.PLAIN)
        style = "plain";
      else if(styleCode == Font.BOLD)
        style = "bold";
      else if(styleCode == Font.ITALIC)
        style = "italic";
      else if(styleCode == Font.ITALIC+Font.BOLD)
        style = "bold-italic";
      assert style != null;
      attr.setValue(style);
      fontElement.setAttributeNode(attr);
 
      attr = doc.createAttribute("pointsize");
      attr.setValue(String.valueOf(font.getSize()));
      fontElement.setAttributeNode(attr);
      textElement.appendChild(fontElement);
 
      // Create the <string> node
      org.w3c.dom.Element string = doc.createElement("string");
 
      // Create the <bounds> node and its attributes
      org.w3c.dom.Element bounds = doc.createElement("bounds");
      attr = doc.createAttribute("width");
      attr.setValue(String.valueOf(this.bounds.width));
      bounds.setAttributeNode(attr);
      attr = doc.createAttribute("height");
      attr.setValue(String.valueOf(this.bounds.height));
      bounds.setAttributeNode(attr);
      string.appendChild(bounds);      // Set <bounds> element as <string> content

      string.appendChild(doc.createTextNode(text));
      textElement.appendChild(string);// Set <text> as <string> content
      doc.getDocumentElement().appendChild(textElement);
    }

    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 + -