Java中画带有箭头的线段

最近由于要画活动图,所以需要画带有箭头的线段,于是结合有关资料,写出了这个方法。

import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;

public class test//读者可以更改类test的名字,以适合自己定义的.java文件,因为它只是用来测试的。
{
 public static void main (String args[]){
     DrawFrame frame=new DrawFrame();
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     frame.setVisible(true);
    }
}

class DrawFrame extends JFrame
 {
 public DrawFrame()
 {
 setTitle("Activity Diagram"); 
 setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
// add panel to frame
 ArrowLinePanel panel=new ArrowLinePanel();
 add(panel);
 }
// 活动图窗口大小
 public static final int DEFAULT_WIDTH=1000;
 public static final int DEFAULT_HEIGHT=800;
 }
 class ArrowLinePanel extends JPanel
{
 // confirm the line position
 
 public ArrowLinePanel()
 {
  setBackground(Color.white);
 }
 public void paintComponent(Graphics g)
 {
  super.paintComponent(g);
 

 Graphics2D g2=(Graphics2D) g; 
  g2.setPaint(Color.black);

 drawAL(x1, y1, x2, y2, g2);//这里x1, y1, x2, y2必须要声明并且初始化,而具体声明的位置和初始化的值

//由编者自己决定,在这里,笔者没有声明它们。

}

 

 public static void drawAL(int sx, int sy, int ex, int ey,Graphics2D g2)

{

        double  H  =   6 ;  // 箭头高度   
         double  L  =   6 ; // 底边的一半  
         int  x3  =   0 ;
         int  y3  =   0 ;
         int  x4  =   0 ;
         int  y4  =   0 ;
         double  awrad  =  Math.atan(L  /  H);  // 箭头角度   
         double  arraow_len  =  Math.sqrt(L  *  L  +  H  *  H); // 箭头的长度   
         double [] arrXY_1  =  rotateVec(ex  -  sx, ey  -  sy, awrad,  true , arraow_len);
         double [] arrXY_2  =  rotateVec(ex  -  sx, ey  -  sy,  - awrad,  true , arraow_len);
         double  x_3  =  ex  -  arrXY_1[ 0 ];  // (x3,y3)是第一端点   
         double  y_3  =  ey  -  arrXY_1[ 1 ];
         double  x_4  =  ex  -  arrXY_2[ 0 ]; // (x4,y4)是第二端点   
         double  y_4  =  ey  -  arrXY_2[ 1 ];

       Double X3  =   new  Double(x_3);
       x3  =  X3.intValue();
       Double Y3  =   new  Double(y_3);
       y3  =  Y3.intValue();
       Double X4  =   new  Double(x_4);
       x4  =  X4.intValue();
       Double Y4  =   new  Double(y_4);
       y4  =  Y4.intValue();
        // g.setColor(SWT.COLOR_WHITE);
        // 画线
        g2.drawLine(sx, sy, ex, ey);
        // 画箭头的一半
        g2.drawLine(ex, ey, x3, y3);
        // 画箭头的另一半
        g2.drawLine(ex, ey, x4, y4);

     }

 


        //计算
    public  static double [] rotateVec( int  px,  int  py,  double  ang,  boolean  isChLen,
            double  newLen)   {

        double  mathstr[]  =   new   double [ 2 ];
        // 矢量旋转函数,参数含义分别是x分量、y分量、旋转角、是否改变长度、新长度   
         double  vx  =  px  *  Math.cos(ang)  -  py  *  Math.sin(ang);
        double  vy  =  px  *  Math.sin(ang)  +  py  *  Math.cos(ang);
        if  (isChLen)   {
            double  d  =  Math.sqrt(vx  *  vx  +  vy  *  vy);
           vx  =  vx  /  d  *  newLen;
           vy  =  vy  /  d  *  newLen;
           mathstr[ 0 ]  =  vx;
           mathstr[ 1 ]  =  vy;
       }
        return  mathstr;
   }

 

 

}

运行这个程序就可以看到结果了,然后编者可以根据自己的需要来修改代码中的一些参数值。

你可能感兴趣的:(Java)