📄 element.java
字号:
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 + -