📄 linefigure.java
字号:
package drawfigure;/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author unascribed * @version 1.0 */import java.awt.*;import java.awt.geom.*;public class LineFigure extends Figure implements Cloneable { //两个可用来改变大小的控制块矩形 private ControlRect controlRect1, controlRect2; public ControlRect getControlRect1() { return controlRect1; } public void setControlRect1(ControlRect rect1) { controlRect1 = rect1; if (controlRect1 != null && controlRect2 != null) { adjustContrlRectPosi(); //调整 } } public void setControlRect2(ControlRect rect2) { controlRect2 = rect2; if (controlRect1 != null && controlRect2 != null) { adjustContrlRectPosi(); //调整 } } public ControlRect getControlRect2() { return controlRect2; } public void setStartPoint(Point2D start) { super.setStartPoint(start); setControlRect1(new ControlRect(start)); } public void setEndPoint(Point2D end) { super.setEndPoint(end); setControlRect2(new ControlRect(end)); } public LineFigure() { } public LineFigure(Point2D p) { super(p); } public Object clone() { LineFigure lineFigure = new LineFigure(); lineFigure.setStartPoint((Point2D) getStartPoint().clone()); lineFigure.setEndPoint((Point2D) getEndPoint().clone()); return lineFigure; } public void draw(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.draw( new Line2D.Double( getStartPoint().getX(), getStartPoint().getY(), getEndPoint().getX(), getEndPoint().getY())); if (isSelected()) { Color oldColor = g2.getColor(); g2.setColor(Color.black); controlRect1.paint(g2); controlRect2.paint(g2); g2.setColor(oldColor); } } /** * 返回点p所在的控制块,如果不在,返回null * (non-Javadoc) * @see drawfigure.Figure#pointInResizeControl(java.awt.Point) */ public boolean pointInControlRect(Point2D p) { if (controlRect1.pointInside(p)) return true; if (controlRect2.pointInside(p)) return true; return false; } public ControlRect getControlRect(Point2D p) { if (controlRect1.pointInside(p)) return controlRect1; if (controlRect2.pointInside(p)) return controlRect2; return null; } /** * (non-Javadoc) * @see drawfigure.Figure#resize(java.awt.Graphics, java.awt.Point) */ /* public void resize(Graphics g,double offsetX,double offsetY) { this.draw(g); } */ public boolean pointInside(Point2D p) { double maxX, maxY, minX, minY; double k, b; maxX = Math.max(getStartPoint().getX(), getEndPoint().getX()); minX = Math.min(getStartPoint().getX(), getEndPoint().getX()); maxY = Math.max(getStartPoint().getY(), getEndPoint().getY()); minY = Math.min(getStartPoint().getY(), getEndPoint().getY()); if (maxX - minX < 5) { //如果是垂直线 return (Math.abs(p.getX() - maxX)) <= 5 && (p.getY() < maxY) && (p.getY() > minY); } else if (maxY - minY < 5) { //如果是水平线 return (Math.abs(p.getY() - maxY) <= 5) && (p.getX() < maxX) && (p.getX() > minX); } else { //根据公式判断 //判断公式为:y = k * x + b 斜率:k = (y2 - y1) / (x2 - x1) y轴截距:b = y1 - k * x1 k = (double) (getEndPoint().getY() - getStartPoint().getY()) / (getEndPoint().getX() - getStartPoint().getX()); b = (double) getStartPoint().getY() - k * getStartPoint().getX(); if ((p.getY() >= (k * p.getX() + b) - 5) && (p.getY() <= (k * p.getX() + b) + 5) && (p.getX() >= minX) && (p.getX() <= maxX) && (p.getY() >= minY) && (p.getY() <= maxY)) { return true; } } return false; } public void setStartEndPoint(Point2D start, Point2D end) { setStartPoint(start); setEndPoint(end); controlRect1 = new ControlRect(start); controlRect2 = new ControlRect(end); }/* public Cursor getCursor(Point2D p) { ControlRect ctrl = this.getControlRect(p); if (ctrl != null) { return ctrl.getCursor(); } return new Cursor(Cursor.DEFAULT_CURSOR); }*/ /** * 调整控制块的位置属性,如果本图形形状改变是,需要使用 * 比如,有形状'\'转换成'/',那么原先控制块的属性就发生变化 */ void adjustContrlRectPosi() { if((getControlRect1()==null)||(getControlRect2()==null)){ return; } /*if (controlRect1.getCenter().getX() == controlRect2.getCenter().getX()) { controlRect1.setPosition(ControlRect.TOP_POSITION); controlRect2.setPosition(ControlRect.BOTTOM_POSITION); return; }*/ /* if (controlRect1.getCenter().getY() == controlRect2.getCenter().getY()) { controlRect1.setPosition(ControlRect.LEFT_POSITION); controlRect2.setPosition(ControlRect.RIGHT_POSITION); return; }*/ //如果块1在左边 if (controlRect1.getCenter().getX() < controlRect2.getCenter().getX()) { //如果块1在左面 if (controlRect1.getCenter().getY() > controlRect2.getCenter().getY()) { controlRect1.setPosition(ControlRect.LEFT_BOTTOM_POSITION); //左下 controlRect2.setPosition(ControlRect.RIGHT_TOP_POSITION); } else { controlRect1.setPosition(ControlRect.LEFT_TOP_POSITION); //左上 controlRect2.setPosition(ControlRect.RIGHT_BOTTOM_POSITION); } } else { // 如果块1在右面 if (controlRect1.getCenter().getY() > controlRect2.getCenter().getY()) { controlRect1.setPosition(ControlRect.RIGHT_BOTTOM_POSITION); //右下 controlRect2.setPosition(ControlRect.LEFT_TOP_POSITION); } else { controlRect1.setPosition(ControlRect.RIGHT_TOP_POSITION); //右上 controlRect2.setPosition(ControlRect.LEFT_BOTTOM_POSITION); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -