getX()和getY()可以返回MOUSE当前坐标,如果需要即时响应就用MouseMove()方法

解决方案 »

  1.   


    要画线条吗?那就在取来的坐标出画点不就组成线了吗!在显示坐标的地方,欲显示新坐标时就把那个地方的字清掉,可以用:clearRect()好像是叫这个名字
      

  2.   


    JDK里面的DEMO就有现成的APPLET例子,好好看看吧!
      

  3.   

    //xyAxisApplet.java
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.net.*;class xyAxisPanel extends JPanel implements MouseMotionListener
    {
    public xyAxisPanel(double[][] tmpPoints)
    {
    System.out.println("xyAxisPanel");
    /*
    Points[0][0]=2;
    Points[0][1]=4.5;
    Points[1][0]=3;
    Points[1][1]=4;
    Points[2][0]=6;
    Points[2][1]=5;
    Points[3][0]=8.3;
    Points[3][1]=7.9;
    Points[4][0]=9.5;
    Points[4][1]=1.5;
    Points[5][0]=13.5;
    Points[5][1]=3.5;
    */
    Points=new double[tmpPoints.length][2];
    for(int i=0;i<tmpPoints.length;i++)
    {
    Points[i][0]=tmpPoints[i][0];
    Points[i][1]=tmpPoints[i][1];
    }

    realPoints=new int[Points.length][2];
    for(int i=0;i<Points.length;i++) //把逻辑坐标转换成为物理坐标
    {
    realPoints[i][0]=oxy.x+(int)(Points[i][0]*dx);
    realPoints[i][1]=oxy.y-(int)(Points[i][1]*dy);
    System.out.println(Points[i][0] + "->" + realPoints[i][0] + "," + Points[i][1] + "->" + realPoints[i][1]);
    }

    addMouseMotionListener(this);
    }

    public int find(int x,int y)
    {
    for(int i=0;i<realPoints.length;i++)
    {
    if((x>=realPoints[i][0]-SQUARELENGTH/2 && x<=realPoints[i][0]+SQUARELENGTH/2)&&(y>=realPoints[i][1]-SQUARELENGTH/2 && y<=realPoints[i][1]+SQUARELENGTH/2))
    return i;
    }
    return -1;
    }

    public void mouseMoved(MouseEvent evt)
    {
    int x=evt.getX();
    int y=evt.getY();
    int i=find(x,y);
    if(i>=0)
    {
    if(hintPointNo==-1)
    {
    //从框外到框内和从一个节点的框到另一个节点的框要重画
    hintPointNo=i;
    repaint();
    }
    else
    if(hintPointNo!=i)
    {
    //从框外到框内和从一个节点的框到另一个节点的框要重画
    hintPointNo=i;
    repaint();
    }
    }
    else
    {
    if(hintPointNo!=-1)
    {
    //从框内到框外要重画
    repaint();
    hintPointNo=-1;

    }
    }
    }

    public void mouseDragged(MouseEvent evt)
    {}

    public void paintComponent(Graphics g)
    {
    super.paintComponent(g);
    drawXYAxisPoints(g,oxy,xlength,ylength,dx,dy,rulelength,Points);
    drawPosition(g);
    }

    public void drawPosition(Graphics g)
    {
    if(hintPointNo!=-1)
    {
    g.setColor(Color.blue);
    String str;
    str=Points[hintPointNo][0]+" , "+Points[hintPointNo][1];
    g.drawString(str,realPoints[hintPointNo][0]+3,realPoints[hintPointNo][1]-3);
    //画垂直标记线
    g.drawLine(realPoints[hintPointNo][0],realPoints[hintPointNo][1],realPoints[hintPointNo][0],oxy.y);
    //画水平标记线
    g.drawLine(realPoints[hintPointNo][0],realPoints[hintPointNo][1],oxy.x,realPoints[hintPointNo][1]);
    }
    }

    //oxy是逻辑坐标系的原点(使用物理坐标);xlength,ylength是x轴和y轴的长度(使用物理坐标);dx,dy是x轴和y轴一个单位的长度(使用物理坐标);rulelength是标记坐标轴单元的小竖线长度;数组Points包含了在逻辑坐标系中显示的点(使用逻辑坐标)
    public void drawXYAxisPoints(Graphics g,Point oxy,int xlength,int ylength,int dx,int dy,int rulelength,double[][] Points)
    {
    drawXYAxis(g,oxy,xlength,ylength,dx,dy,rulelength);
    drawPoints(g,oxy,dx,dy,Points);

    }

    public void drawXYAxis(Graphics g,Point oxy,int xlength,int ylength,int dx,int dy,int rulelength)
    {
    g.setColor(Color.black);
    g.drawLine(oxy.x , oxy.y , (oxy.x+xlength) , oxy.y); //绘制x轴
    g.drawLine(oxy.x , oxy.y , oxy.x , (oxy.y-ylength)); //绘制y轴
    int xnum,ynum; //xnum,ynum是x轴和y轴上的单元数
    xnum=xlength/dx;
    ynum=ylength/dy;
    for(int i=0;i<xnum;i++) //画x轴上的标尺
    {
    g.drawLine(oxy.x+(i+1)*dx , oxy.y , oxy.x+(i+1)*dx , oxy.y-rulelength);
    }
    for(int i=0;i<ynum;i++) //画y轴上的标尺
    {
    g.drawLine(oxy.x , oxy.y-(i+1)*dy , oxy.x+rulelength , oxy.y-(i+1)*dy);
    }
    String str="x"; //画x,y轴的标记
    int cx=oxy.x+xlength;
    int cy=oxy.y+3*rulelength;
    g.drawString(str,cx,cy);
    str="y";
    cx=oxy.x-3*rulelength;
    cy=oxy.y-ylength;
    g.drawString(str,cx,cy);
    }

    public void drawPoints(Graphics g,Point oxy,int dx,int dy,double[][] Points)
    {
    System.out.println(Points.length);
    g.setColor(Color.red);
    g.drawRect(realPoints[0][0]-SQUARELENGTH/2,realPoints[0][1]-SQUARELENGTH/2,SQUARELENGTH,SQUARELENGTH);
    for(int i=0;i<realPoints.length-1;i++)
    {
    g.drawRect(realPoints[i+1][0]-SQUARELENGTH/2,realPoints[i+1][1]-SQUARELENGTH/2,SQUARELENGTH,SQUARELENGTH);
    g.drawLine(realPoints[i][0],realPoints[i][1],realPoints[i+1][0],realPoints[i+1][1]);
    }
    }

    private Point oxy=new Point(50,250); //oxy是逻辑坐标系的原点(使用物理坐标)
    private int xlength=309; //xlength,ylength是x轴和y轴的长度(使用物理坐标)
    private int ylength=209;
    private int dx=10; //dx,dy是x轴和y轴一个单位的长度(使用物理坐标)
    private int dy=10;
    private int rulelength=3; //rulelength是标记坐标轴单元的小竖线长度
    private double[][] Points; //数组Points包含了在逻辑坐标系中显示的点(使用逻辑坐标)
    private int[][] realPoints; //存放逻辑坐标对应的物理坐标
    private static final int SQUARELENGTH = 6;
    private int hintPointNo=-1; //上一次显示节点坐标的序号
    }public class xyAxisApplet extends JApplet
    {
    public void init()
    {
    String v=getParameter("values");
           if(v==null)
           return;
           int n=Integer.parseInt(v);
           double[][] Points=new double[n][2]; //存放从网页读入的数据,inpoint[?][0]和inpoint[?][1]是mapTable的下标.inpoint[?][3]是错误的序号.
           int i;
           String tmp;
    int beginIndex,endIndex;
           String a=getParameter("points");
           System.out.println("input:"+a);
           beginIndex=0;
    for(i=0;i<n;i++)
    {
    endIndex=a.indexOf(",",beginIndex);
    System.out.println("b "+beginIndex+" e "+endIndex);
    tmp=a.substring(beginIndex,endIndex);
    System.out.println("1 "+tmp);
    Points[i][0]=Double.parseDouble(tmp);
    System.out.println("2 "+Points[i][0]+"");
    System.out.println("b "+beginIndex+" e "+endIndex);
    beginIndex=endIndex+1;
    System.out.println("b "+beginIndex+" e "+endIndex);
    endIndex=a.indexOf(",",beginIndex);
    System.out.println("b "+beginIndex+" e "+endIndex);
    tmp=a.substring(beginIndex,endIndex);
    System.out.println("3 "+tmp);
    Points[i][1]=Double.parseDouble(tmp);
    System.out.println("4 "+Points[i][1]+"");
    beginIndex=endIndex+1;
    System.out.println("b "+beginIndex+" e "+endIndex);
    }


    Container contentPane=getContentPane();
    contentPane.add(new xyAxisPanel(Points));

    }

    public void start()
    {
    repaint();
    }
    }
    xyAxisApplet.asp
    <html>
    <title>xyAxisApplet</title>
    <body><%
    values=6
    points="2,4.5,3,4,6,5,8.3,7.9,9.5,1.5,13.5,3.5,"
    %><!--"CONVERTED_APPLET"-->
    <!-- CONVERTER VERSION 1.3 -->
    <p>用户坐标系测试</p>
    <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
    WIDTH = 400 HEIGHT = 300  codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0">
    <PARAM NAME = CODE VALUE = "xyAxisApplet" ><PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
    <PARAM NAME="scriptable" VALUE="false"><PARAM NAME="values" VALUE=<%=values%>>
    <PARAM NAME="points" VALUE=<%=points%>><COMMENT>
    <EMBED type="application/x-java-applet;version=1.3"  CODE = "xyAxisApplet" WIDTH = 400 HEIGHT = 300  scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED></COMMENT></NOEMBED></EMBED>
    </OBJECT><!--
    <APPLET CODE = "CheckTestApplet" WIDTH = 950 HEIGHT = 342>
    </APPLET>
    -->
    <!--"END_CONVERTED_APPLET"-->
    </body>
    </html>一个原创的applet例程,在自定义坐标系中画折线图,当鼠标移到节点会显示节点的坐标.与zytang的需求有些出入,但我想思路有共同点.另外程序有些乱.
      

  4.   

    下面是一个application的例程是我原创程序的一个中间备份,这个备份实现了显示鼠标坐标
    //cyberEyeApp.java
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;class cyberEye
    {
    public cyberEye(int tmpX,int tmpY,int tmpRadius)
    {
    setCyberEyeCenter(tmpX,tmpY);
    setCyberEyeRadius(tmpRadius);
    myCyberEyeBall=new cyberEyeBall(cyberEyeCenter[0],cyberEyeCenter[1],15);
    myFocusPoint=new focusPoint(cyberEyeCenter[0],cyberEyeCenter[1]);
    }

    //注视焦点要跟着鼠标的移动而改变
    public void focusPointChange(int tmpX,int tmpY)
    {
    myFocusPoint.setFpPosition(tmpX,tmpY);
    }

    public void setCyberEyeCenter(int tmpX,int tmpY)
    {
    cyberEyeCenter[0]=tmpX;
    cyberEyeCenter[1]=tmpY;
    }

    public void setCyberEyeRadius(int tmpRadius)
    {
    cyberEyeRadius=tmpRadius;
    }

    public void drawCyberEye(Graphics g)
    {
    g.setColor(Color.black);
    g.drawArc(cyberEyeCenter[0]-cyberEyeRadius,cyberEyeCenter[1]-cyberEyeRadius,2*cyberEyeRadius,2*cyberEyeRadius,0,360);
    myCyberEyeBall.drawCyberEyeBall(g);
    myFocusPoint.drawFpLine(g,cyberEyeCenter[0],cyberEyeCenter[1]);
    }

    //内部类:注视焦点类
    public class focusPoint
    {
    public focusPoint(int tmpX,int tmpY)
    {
    setFpPosition(tmpX,tmpY);
    }

    public void setFpPosition(int tmpX,int tmpY)
    {
    fpPosition[0]=tmpX;
    fpPosition[1]=tmpY;
    }

    //测试用,画从眼睛中心到注视焦点的连线
    public void drawFpLine(Graphics g,int eyeCenterX,int eyeCenterY)
    {
    g.setColor(Color.yellow);
    g.drawLine(eyeCenterX,eyeCenterY,fpPosition[0],fpPosition[1]);
    //画一个小瞄准器
    g.drawRect(fpPosition[0]-RECTWIDTH/2,fpPosition[1]-RECTWIDTH/2,RECTWIDTH,RECTWIDTH);
    g.drawLine(fpPosition[0]-LINELENGTH/2,fpPosition[1],fpPosition[0]+LINELENGTH/2,fpPosition[1]);
    g.drawLine(fpPosition[0],fpPosition[1]-LINELENGTH/2,fpPosition[0],fpPosition[1]+LINELENGTH/2);
    //显示注视焦点的坐标
    String str=fpPosition[0]+","+fpPosition[1];
    g.drawString(str,fpPosition[0]+DIFFX,fpPosition[1]+DIFFY);
    }

    private final int RECTWIDTH=6; //瞄准器中正方形的边长
    private final int LINELENGTH=12; //瞄准器中直线的长度
    private final int DIFFX=0; //显示文字的基坐标的X轴偏移量
    private final int DIFFY=-8; //显示文字的基坐标的y轴偏移量
    private int[] fpPosition=new int[2];

    }

    //内部类:眼球类
    public class cyberEyeBall
    {
    public cyberEyeBall(int tmpX,int tmpY,int tmpRadius)
    {
    setCyberEyeBallCenter(tmpX,tmpY);
    setCyberEyeBallRadius(tmpRadius);
    }

    public void setCyberEyeBallCenter(int tmpX,int tmpY)
    {
    cyberEyeBallCenter[0]=tmpX;
    cyberEyeBallCenter[1]=tmpY;
    }

    public void setCyberEyeBallRadius(int tmpRadius)
    {
    cyberEyeBallRadius=tmpRadius;
    }

    public void drawCyberEyeBall(Graphics g)
    {
    g.setColor(Color.black);
    g.fillArc(cyberEyeBallCenter[0]-cyberEyeBallRadius,cyberEyeBallCenter[1]-cyberEyeBallRadius,2*cyberEyeBallRadius,2*cyberEyeBallRadius,0,360);
    }

    private int[] cyberEyeBallCenter=new int[2]; //存放眼睛中心点的坐标
    private int cyberEyeBallRadius; //存放眼睛的半径
    }

    private int[] cyberEyeCenter=new int[2]; //存放眼睛中心点的坐标
    private int cyberEyeRadius; //存放眼睛的半径
    private cyberEyeBall myCyberEyeBall;
    private focusPoint myFocusPoint;
    }class cyberEyeAppPanel extends JPanel implements MouseMotionListener
    {
    public cyberEyeAppPanel()
    {
    addMouseMotionListener(this);
    }

    public void mouseMoved(MouseEvent evt)
    {
    int tmpX=evt.getX();
    int tmpY=evt.getY();
    cyberEyeLeft.focusPointChange(tmpX,tmpY);
    repaint();
    }

    public void mouseDragged(MouseEvent evt)
    {}

    public void paintComponent(Graphics g)
    {
    super.paintComponent(g);
    cyberEyeLeft.drawCyberEye(g);
    }

    private cyberEye cyberEyeLeft=new cyberEye(100,100,50);


    }class cyberEyeAppFrame extends JFrame
    {
    public cyberEyeAppFrame()
    {
    setTitle("电脑之眼");
    setSize(400,300);
    addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    System.exit(0);
    }
    });
    Container contentPane=getContentPane();
    contentPane.add(new cyberEyeAppPanel()); 
    }
    }public class cyberEyeApp
    {
    public static void main(String[] args)
    {
    JFrame myFrame=new cyberEyeAppFrame();
    myFrame.show();
    }

    }
      

  5.   

    谢谢 ,magus_yang(⊙杨⊙) 
    可是我很菜,分数不多
    给你5分吧,还请多多指教