📄 assoicatorline.java
字号:
package com.sunking.tp.framework;import java.awt.*;import javax.swing.*;import javax.swing.event.*;import java.awt.geom.*;import java.util.*;/** * <p>Title: </p> * <p>Description: 连线</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author <a href="mailto:sunkingxie@hotmail.com">SunKing</a> * @version 1.0 * @see Assoicator */public class AssoicatorLine extends Line2D.Double implements java.io.Serializable{ private static final long serialVersionUID = -3000000000000000003L; /** *连线的源和目录 */ public JTPComponent source,dest; /** *连线类型 */ private int associateType; /** *连线修饰器 */ private Vector vecRenderer = new Vector(); /** * * @param source 连线源 * @param associator 连接器 */ public AssoicatorLine(JTPComponent source,Assoicator associator){ dest = associator.getAssoicator(); associateType = associator.getAssociateType(); this.source = source; setLinePoints((Component)source,(Component)dest); addRenderer(new Arrow(this)); } /** *取得连接源 * @return */ public JTPComponent getSource(){ return source; } /** *取得连接目标 * @return */ public JTPComponent getDest(){ return dest; } /** *取得连接类型 * @return */ public int getAssociateType(){ return associateType; } /** *判断是否包含一个点,主要用于点击时的选取动作 * @param p * @return */ public boolean contains(Point2D p) { return contains((int)p.getX(),(int)p.getY()); } public boolean contains(int x, int y) { return insideSegment(x,y,(int)getX1(),(int)getY1(),(int)getX2(),(int)getY2()); } protected boolean insideSegment(int x, int y, int x0, int y0, int x1, int y1) { if (x1 == x0) return (x == x0) && (y >= Math.min(y0,y1)) && (y <= Math.max(y0,y1)); Rectangle bounds = new Rectangle(x0,y0,1,1); int fudge = (int)Math.round(insideTolerance()); bounds.add(x1,y1); bounds.grow(fudge,fudge); if (!bounds.contains(x,y)) return false; double slope = (double)(y1-y0) / (double)(x1-x0); double fx = (slope * (double)(x-x0)) + (double)y0; return Math.abs(fx - (double)y) < insideTolerance(slope); } protected double insideTolerance(double slope) { return Math.max(insideTolerance(),Math.abs(slope)); } protected double insideTolerance() { return 2.5; } /** *绘制线和修饰器 * @param g */ public void drawLine(Graphics g){ Point2D pStart = getP1(); Point2D pEnd = getP2(); g.drawLine((int)pStart.getX(),(int)pStart.getY(), (int)pEnd.getX(),(int)pEnd.getY()); for (int i = 0; i < vecRenderer.size(); i++) { LineRenderer renderer = (LineRenderer)vecRenderer.get(i); renderer.paint(g); } } /** *绘制选取状态 * @param g */ public void drawHandle(Graphics g){ Graphics2D g2=(Graphics2D)g; g2.setStroke(new BasicStroke(2)); drawLine(g); g2.setStroke(new BasicStroke(1)); } /** *添加修饰器 * @param renderer */ public void addRenderer(LineRenderer renderer){ vecRenderer.add(renderer); } /** *移取修饰器 * @param renderer */ public void removeRenderer(LineRenderer renderer){ vecRenderer.remove(renderer); } /** *根据连接源和连接目标定位线的位置 * @param source * @param target */ private void setLinePoints(Component source,Component target){ Component cSource =(Component)source; Component cDest =(Component)dest; int x1,y1,x2,y2; x1=y1=x2=y2=0; x1=cSource.getX()+(cSource.getWidth()/2); y1=cSource.getY()+(cSource.getHeight()/2); x2=cDest.getX()+(cDest.getWidth()/2); y2=cDest.getY()+(cDest.getHeight()/2); setLine(x1,y1,x2,y2); setLine(getPointShortToComponent(cSource),getPointShortToComponent(cDest)); } private Point getPointShortToComponent(Component c){ int x1=c.getX(); int y1=c.getY(); int x2=x1+c.getWidth(); int y2=y1+c.getHeight(); if(intersectsLine(x1,y1,x2,y1)){//top return new Point(x1+c.getWidth()/2,y1); }else if(intersectsLine(x1,y2,x2,y2)){//bottom return new Point(x1+c.getWidth()/2,y2); }else if(intersectsLine(x2,y1,x2,y2)){//right return new Point(x2,y1+c.getHeight()/2); }else{//left return new Point(x1,y1+c.getHeight()/2); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -