getX()和getY()可以返回MOUSE当前坐标,如果需要即时响应就用MouseMove()方法
解决方案 »
- 采用一维数组输出杨辉三角形
- 帮我看看 表格输出数据库的代码为何有异常
- Map接口问题---Map m=new HashMap()这句话怎么理解啊???
- 解析 bytes 数组 求好心人帮我仔细看看如下所说,十分感谢!!!
- 欢迎Baidu和Google工作的兄弟们进去指点指点,我这种方法是否能够用于大型搜索?
- 请问 集合里面hashmap和hashtable有什么不一样?
- 请大家帮忙!socket只能接收部分数据
- JTable 怎样选择一行?
- 关于RMI的问题
- 在javaSE里面,为什么要使用泛型通配符呢?
- 怎么d版的jbuilder5装了后不能启动呀,大侠救命!!!
- 新手提问:javac时出错
要画线条吗?那就在取来的坐标出画点不就组成线了吗!在显示坐标的地方,欲显示新坐标时就把那个地方的字清掉,可以用:clearRect()好像是叫这个名字
JDK里面的DEMO就有现成的APPLET例子,好好看看吧!
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的需求有些出入,但我想思路有共同点.另外程序有些乱.
//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分吧,还请多多指教