帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

235 lines
6.1 KiB

package com.fr.grid;
import java.awt.Color;
import java.awt.Graphics;
import com.fr.base.FRContext;
/**
* 画动态虚线
* @author Daniel~
*
*/
public class DrawFlowRect implements Runnable {
private int templen=0;
private int lenReal=0;
private boolean isReal=false;
private Grid grid;
private boolean running = true;
public DrawFlowRect(){
new Thread(this, "drawFlowLine").start();
}
/**
*
* @param grid
*/
public void setGrid(Grid grid){
this.grid=grid;
}
/**
*
*/
public void run() {
while(running){
templen = templen +1;
if(templen >= 4)
{
templen = 0;
isReal = !isReal;
}
//不是这个状态就不要继续画了,否则太卡
if(grid != null && !grid.IsNotShowingTableSelectPane()){
grid.repaint();
}
try {
Thread.sleep(25);
} catch (InterruptedException e) {
FRContext.getLogger().error(e.getMessage(), e);
}
}
}
/**
* 画框框
* @param g
* @param x
* @param y
* @param width
* @param height
*/
public void drawFlowRect(Graphics g, int x, int y, int width, int height) {
Color oldColor = g.getColor();
lenReal = templen;
boolean oldisReal = isReal; //备份
int oldlenReal = lenReal; //备份
drawTopLine(g, x, y, width, oldisReal, oldlenReal);
drawRightLine(g, x, y, width, height, oldisReal, oldlenReal);
drawLeftLine(g, x, y, height, oldisReal, oldlenReal);
drawBottomLine(g, x, y, width, height, oldisReal, oldlenReal);
isReal = oldisReal; //还原 数据
g.setColor(oldColor);
}
private void drawTopLine(Graphics g, int x, int y, int width, boolean oldisReal, int oldlenReal) {
g.setColor(Color.black); //上
//第一根线先画黑色背景
g.drawLine(x, y, width, y);
//第二根线同上
g.drawLine(x-1, y-1, width, y-1);
g.setColor(Color.white);
//第一根白色虚线
drawFlowLine(g, x, y, width, y);
isReal = oldisReal; //还原 数据
lenReal = oldlenReal;
//第二根白色虚线
drawFlowLine(g, x-1, y-1, width, y-1);
}
private void drawRightLine(Graphics g, int x, int y, int width,int height, boolean oldisReal, int oldlenReal) {
g.setColor(Color.black); //右
g.drawLine(width, y, width, height);
g.drawLine(width-1, y-1, width-1, height);
g.setColor(Color.white);
isReal = oldisReal; //还原 数据
lenReal = oldlenReal;
drawFlowLine(g, width, y, width, height);
isReal = oldisReal; //还原 数据
lenReal = oldlenReal;
drawFlowLine(g, width-1, y-1, width-1, height);
}
private void drawLeftLine(Graphics g, int x, int y, int height, boolean oldisReal, int oldlenReal) {
//左下要反过来画
g.setColor(Color.black); //左
g.drawLine(x, height, x, y);
g.drawLine(x+1, height-1, x+1, y);
g.setColor(Color.white);
isReal = oldisReal; //还原 数据
lenReal = oldlenReal;
drawFlowLine(g, x, height, x, y );
isReal = oldisReal; //还原 数据
lenReal = oldlenReal;
drawFlowLine(g, x+1, height+1, x+1, y );
}
private void drawBottomLine(Graphics g, int x, int y, int width,int height, boolean oldisReal, int oldlenReal) {
g.setColor(Color.black); //下
g.drawLine(width, height, x, height);
g.drawLine(width+1, height+1, x, height+1);
g.setColor(Color.white);
isReal = oldisReal; //还原 数据
lenReal = oldlenReal;
drawFlowLine(g, width, height, x, height);
isReal = oldisReal; //还原 数据
lenReal = oldlenReal;
drawFlowLine(g, width+1, height+1, x, height+1);
}
//流动虚线,支持反方向作画
private void drawFlowLine(Graphics g, int x1, int y1, int x2, int y2) {
int x = x1, y=y1;
int n = 4; //实线段长度
int m = 5; //虚线段长度
int tx = 0,ty = 0;
int mark_x = 0; //标记 如果为1 表示水平线
int mark_y = 0; //标记 如果为1 标识垂直线
int c = 1;
boolean flag = true;
//正向为1反向为-1不变为0
if(x2-x1 != 0)
mark_x = x1<x2?1:-1;
else
mark_y = y1<y2?1:-1;
//先画流动虚线的第一部分
if(isReal)
{
//实线
tx = (lenReal*mark_x + x1);
ty = (lenReal*mark_y + y1);
g.drawLine(x,y,tx,ty);
x = ((m + lenReal)*mark_x + x1);
y = ((m + lenReal)*mark_y + y1);
}
else
{
//虚线
x = (lenReal*mark_x + x1);
y = (lenReal*mark_y + y1);
}
int ttx = x; //第二部分起始位置 x坐标
int tty = y; //第二部分起始位置 y坐标
drawTheRestPart(g, x, y, x1, y1, x2, y2, m, n, ttx, tty, mark_x, mark_y, tx, ty, flag, c);
}
private void drawTheRestPart(Graphics g, int x, int y, int x1, int y1, int x2, int y2, int m, int n, int ttx, int tty,
int mark_x, int mark_y, int tx, int ty, boolean flag, int c) {
do
{
tx = ((c*(n+m) - m)*mark_x + ttx);
ty = ((c*(n+m) - m)*mark_y + tty);
if(Math.abs(tx-x1) > Math.abs(x2-x1))
{
lenReal = Math.abs(tx - x2); //只支持 水平线和竖线
isReal = true;
tx = x2;
flag = false;
}
if(Math.abs(ty - y1) > Math.abs(y2 - y1))
{
lenReal = Math.abs(ty - y2);
isReal = true;
ty = y2;
flag = false;
}
g.drawLine(x,y,tx,ty);
x = (c*(n+m)*mark_x + ttx);
y = (c*(n+m)*mark_y + tty);
if(x > Math.max(x1, x2) || y > Math.max(y1, y2))
{
if(flag)
{
isReal = false;
if(x > Math.max(x1, x2))
lenReal = x-Math.max(x1, x2);
else
lenReal = y-Math.max(y1, y2);
}
break;
}
c++;
}
while(flag);
}
/**
*
*/
public void exit() {
this.running = false;
}
}