因为我要做一个类似报表编辑的功能,界面上要有坐标系,一系列点组成的折线或者曲线,这些点可以动态拖拽编辑。谁做过类似的,能共享下代码就更好了。另外就是我的数据里面坐标都是小数点后有六位数据的浮点数,如何能够设计一种方法能把它无损的转换成-100-100之间的整数,而且当我在图形界面编辑了之后,还能在再把整数在无损的转换成我的数据的格式。 

解决方案 »

  1.   

    重载JPanel的paint函数即可  
     public void paint(Graphics g){
            Graphics2D gg = (Graphics2D) g;
            super.paint(gg);
            gg.setColor(Color.BLACK);//常规用黑色
             gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);//开启边缘抗锯齿修正
             gg.drawLine(point1.x, point1.y, point2.x, point2.y);//画线的样例
             drawPoint(point,gg);//画点的示例,那个点实际是半径为3的圆
    } public void drawPoint(Point2D point,Graphics2D gg){
                Color prevColor = gg.getColor();//获取之前用的颜色
                 gg.setColor(Color.BLUE);
                 gg.fillOval(point.x - 3, point.y - 3, 6, 6);//通过更改3和6确定半径,此函数实际是画一个椭圆
                 gg.setColor(prevColor);
            } /**
         * 查看一个点是否在指定线段上
         * @param point
         * @param stPoint
         * @param endPoint
         * @param precision 精度修正,即在sqrt(precision)内的点都算在线段上
         * @return
         */
        public static boolean checkPointInLine(PointEntity point,PointEntity stPoint,PointEntity endPoint,double precision)
        {
           if( Line2D.ptSegDistSq(stPoint.getX(),stPoint.getY(),endPoint.getX(),endPoint.getY(),point.getX(),point.getY()) <= precision)
               return true;
           return false;
        }坐标转换自己逻辑算下即可,查看一个点是否在一个线段上用checkPointInLine函数。
    下面是我程序中判断是否在折线上的方法,PointEntity是extends Point2D
    //此方法在PointEntity内,查看两个点是否可被判定为同一个点
      public boolean checkTwoPointSame(PointEntity pointB,double precision)
        {
            if(Point2D.distanceSq(this.getX(),this.getY(),pointB.getX(),pointB.getY()) <= precision)
                return true;
            return false;
        }
        /**
         * 查看一个点是否落在折线上
         * 注意:此函数并不考虑连接元素时需要进行的裁剪
         * @param point 点
         * @param line 目标折线
         * @param precision 误差精度
         * @return List([String 处在第几段折线上], [如果刚好是端点,则用于返回端点])
         */
        public static List checkPointInLine(PointEntity point,LineEntity line,double precision)
        {
            ArrayList retList = new ArrayList();
            ArrayList pointlist = new ArrayList();
            pointlist.add( getElementCenterPoint(line.getFromEntity()));
            pointlist.addAll(line.getPointList());
            pointlist.add(getElementCenterPoint(line.getToEntity()));
            for(int i = 0; i < pointlist.size()-1 ; i++)
            {
               if(checkPointInLine(point,(PointEntity) pointlist.get(i),(PointEntity) pointlist.get(i+1), precision))
               {
                   retList.add(i+"");
                    if(point.checkTwoPointSame((PointEntity) pointlist.get(i), precision))
                        retList.add(pointlist.get(i));
                    else  if(point.checkTwoPointSame((PointEntity) pointlist.get(i+1), precision))
                        retList.add(pointlist.get(i+1));
                    else
                        retList.add(new PointEntity());
                   return retList;
               }
            }
            return null;
        }
      

  2.   


    import java.awt.Color;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;public class TestFrame extends Frame {
    private Image img = null;
    public TestFrame(){

    super("test frame");
    setBackground(Color.BLUE);
    setSize(800,500);
    addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) {
    super.windowClosing(e);
    System.exit(0);
    }

    });
    }

    public static void main(String[] args) {
    TestFrame testFrame = new TestFrame();
    testFrame.setVisible(true);
    }

    public void paint(Graphics g){
    g.setColor(Color.RED);
    g.drawLine(50, 100, 200, 100);
    }

    }