jfhexagon.java
来自「用Java开发的、实现类似Visio功能的应用程序源码」· Java 代码 · 共 273 行
JAVA
273 行
/**
* $Id:JFHexagon.java $
*
* Copyright 2004 ~ 2005 JingFei International Cooperation LTD. All rights reserved. *
*/
package com.jfimagine.jfgraph.shape.polygon;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import com.jfimagine.jfgraph.shape.rectangle.AbstractRectangle;
import com.jfimagine.jfgraph.shape.base.Node;
import com.jfimagine.jfgraph.shape.base.Port;
import com.jfimagine.jfgraph.shape.base.AbstractObject;
import com.jfimagine.jfgraph.shape.base.ShapeConst;
import com.jfimagine.jfgraph.geom.JFPoint;
import com.jfimagine.jfgraph.geom.Rect;
import com.jfimagine.jfgraph.geom.Hexagon;
import com.jfimagine.jfgraph.geom.LineSeg;
/**
* JFHexagon class.
* A rectangle class used to represents an hexagon
*
* @author CookieMaker
*
* @version $Revision: 1.00 $
*/
public class JFHexagon extends AbstractRectangle{
/**
* A XML string tag represents a hexagon.
*/
public static final String XML_HEXAGON ="JFHexagon";
/**
* Constructor for hexagon.
*/
public JFHexagon(){
m_rect =new Hexagon();
setObjectType(ShapeConst.SHAPETYPE_HEXAGON);
setXMLTag(XML_HEXAGON);
}
/**
* Constructor for hexagon.
*
* @param x X coordiate.
*
* @param y Y coordiate.
*
* @param w Width of this hexagon.
*
* @param h Height of this hexagon.
*
*/
public JFHexagon(double x, double y, double w, double h){
m_rect =new Hexagon();
setObjectType(ShapeConst.SHAPETYPE_HEXAGON);
setXMLTag(XML_HEXAGON);
addNode(x,y);
addNode(x+w,y+h);
finishDrawing();
}
/**
* Creates a new AbstractObject of the same class and with the same contents as this object.
* This method implements the method defined in AbstractObject.
*
* @return A clone of this class.
*
*/
protected AbstractObject cloneMe() throws CloneNotSupportedException{
return new JFHexagon();
}
/**
* Add a new node for current node list.
* here this method will always be called by DrawState class or any drawing class.
*
* @param x, y Coordinates of a new node.
*
*/
public void addNode(double x, double y){
super.addNode(x,y);
if (m_nodeAdded>1){
//left-top point and right-bottom point:
JFPoint pnt1 =m_firstNode;
JFPoint pnt2 =new JFPoint(x,y);
m_rect.setVertex(Rect.VERTEXTYPE_LEFTTOP,pnt1.getX(),pnt1.getY());
m_rect.setVertex(Rect.VERTEXTYPE_RIGHTTOP,x,pnt1.getY());
m_rect.setVertex(Rect.VERTEXTYPE_LEFTBOTTOM,pnt1.getX(),y);
m_rect.setVertex(Rect.VERTEXTYPE_RIGHTBOTTOM,x,y);
initNodes();
}
}
/**
* Move/adjust a node of current object.
*
* @param node Currently moving node.
*
* @param x, y Moving offsets.
*
* @param g current drawing canvas.
*
*/
public void moveNode(Node node, double x, double y,Graphics g){
super.moveNode(node,x,y,g);
if (node!=null){
if (node.getXOffset()!=x || node.getYOffset()!=y){
//move node and draw a new dragging shape.
int vertexType =getVertexTypeByNode(node);
m_rect.moveVertex(vertexType,x,y,Rect.VERTEXMOVETYPE_RECTANGLE);
//init shape nodes.
initNodes();
//draw current moving node and its relational lines
draw(g,true);
}
}
}
/**
* Draw current object on graphic canvas.
*
* @param g A graphic canvas.
* @param isXorMode If is in xor mode now.
*
*/
public void draw(Graphics g,boolean isXorMode){
if (g==null)
return;
//if user hide this shape, we'll draw an 'invisible' bounds here.
if (isInvisible()){
drawInvisibleBounds(g,isXorMode);
return;
}
if (!isXorMode)
setTransparencyComposite(g);
double zoom =getZoomScale();
GeneralPath path= new GeneralPath(GeneralPath.WIND_EVEN_ODD);
Hexagon hexagon =(Hexagon)m_rect;
for (int i=Hexagon.HEXAGONSIDE_LEFTTOP; i<=Hexagon.HEXAGONSIDE_LEFTBOTTOM; i++){
LineSeg srcLine =hexagon.getHexagonSide(i);
JFPoint start =srcLine.getPoint1();
JFPoint end =srcLine.getPoint2();
float startX =(float)(start.getX() * zoom);
float startY =(float)(start.getY() * zoom);
float endX =(float)(end.getX() * zoom);
float endY =(float)(end.getY() * zoom);
if (i==Hexagon.HEXAGONSIDE_LEFTTOP)
path.moveTo(startX,startY);
path.lineTo(endX,endY);
}
path.closePath();
if (!isXorMode){
Rect rect =getBounds();
rect.setValue(rect.getX() * zoom, rect.getY() * zoom, rect.getWidth() * zoom, rect.getHeight() * zoom);
m_fillFormat.draw(g,path,rect);
m_lineFormat.draw(g,path);
}else
((Graphics2D)g).draw(path);
if (!isXorMode)
restoreTransparencyComposite(g);
if (!isXorMode){
drawPort(g);
drawLabel(g);
}
}
/**
* Init all ports of this diamond
* An object will always has its one or more stable ports and some customized ports,
* for dimond, it will has four stable ports as below,
* port1 at middle left,
* port2 at middle top,
* port3 at middle right,
* port4 at middle bottom,
*/
protected void initPorts(){
if (m_portList.size()==0){
try{
Hexagon hexagon =(Hexagon)m_rect;
for (int i=Hexagon.HEXAGONSIDE_LEFTTOP; i<=Hexagon.HEXAGONSIDE_LEFTBOTTOM; i++){
LineSeg line =hexagon.getHexagonSide(i);
JFPoint start =line.getPoint1();
JFPoint end =line.getPoint2();
Port port=new Port();
port.setFirstPoint(start);
port.setSecondPoint(end);
port.setPortPoint(start.midPoint(end));
port.setParent(this);
m_portList.add(port);
}
}catch(Exception e){
}
}
m_portList.setZoomScale(getZoomScale());
}
/**
* Start move a node.
*
* @param node The node will be moved.
*
*/
public void startMoveNode(Node node){
m_originalRect =new Hexagon((Hexagon)m_rect);
startMoveLabel();
}
/**
* finish move/adjust a node of current object.
*
* @param node Currently moving node.
*
* @param x, y Moving offsets.
*
* @param g current drawing canvas.
*
*/
public void finishMoveNode(Node node, double x, double y,Graphics g){
finishMoveLabel();
Hexagon originalHexagon =(Hexagon)m_originalRect;
Hexagon hexagon =(Hexagon)m_rect;
for (int i=Hexagon.HEXAGONSIDE_LEFTTOP; i<=Hexagon.HEXAGONSIDE_LEFTBOTTOM; i++){
LineSeg originalLine =originalHexagon.getHexagonSide(i);
LineSeg line =hexagon.getHexagonSide(i);
m_portList.movePort(originalLine.getPoint1(),originalLine.getPoint2(),line.getPoint1(),line.getPoint2());
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?