Java语言程序设计的课程设计项目利用Java实现地球系动画完整实现实例第8部分.docx
《Java语言程序设计的课程设计项目利用Java实现地球系动画完整实现实例第8部分.docx》由会员分享,可在线阅读,更多相关《Java语言程序设计的课程设计项目利用Java实现地球系动画完整实现实例第8部分.docx(21页珍藏版)》请在冰豆网上搜索。
Java语言程序设计的课程设计项目利用Java实现地球系动画完整实现实例第8部分
利用Java实现地球系动画完整实现实例(第8部分)
在界面中“画图”——拖放地球和月亮
1、需要补充的知识
(1)Java中的事件编程
(2)MouseListener接口中的各个方法所代表的事件
publicvoidmousePressed(MouseEvente);//鼠标按键在组件上单击(按下并释放)时调用。
publicvoidmouseReleased(MouseEvente);//鼠标按钮在组件上释放时调用。
publicvoidmouseClicked(MouseEvente);//鼠标按键在组件上按下时调用。
publicvoidmouseEntered(MouseEvente);//鼠标进入到组件上时调用。
publicvoidmouseExited(MouseEvente);//鼠标离开组件时调用。
特别是mousePressed和mouseReleased方法的编程
2、EarthPlanetApplet程序
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.MediaTracker;
importjava.awt.Rectangle;
importjava.awt.Toolkit;
import.URL;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.awt.event.MouseMotionListener;
importjavax.swing.JApplet;
publicclassEarthPlanetAppletextendsJAppletimplementsRunnable,MouseMotionListener,MouseListener{
privateThreadearthMultiThread=null;
privateThreadmoonMultiThread=null;
privateGraphicsguiGraphics;
privateImageallImagesArray[];
privateintcurrentImageIndex=0;
privateintimageWidth=0;
privateintimageHeight=0;
privatebooleanallImagesLoaded=false;
privatefinalintNUMBER_IMAGES=18;
privatebooleanisRunedByApplication=false;
intcurrentRotatingAngle=0;
intearthCenterX0,earthCenterY0;
intcircleRadius=100;
intcurrentRotatingCount=0;
publicstaticvoidmain(String[]args){
EarthPlanetFrameapplicationJFrame=null;
applicationJFrame=newEarthPlanetFrame("利用Java实现的地球系动画");
EarthPlanetAppletthreadApplet=null;
threadApplet=newEarthPlanetApplet();
applicationJFrame.getContentPane().add("Center",threadApplet);
threadApplet.isRunedByApplication=true;
threadApplet.init();
threadApplet.start();
applicationJFrame.setVisible(true);
}
publicEarthPlanetApplet(){
this.addMouseMotionListener(this);
this.addMouseListener(this);
}
publicvoidstart(){
if(earthMultiThread==null){
earthMultiThread=newThread(this);
earthMultiThread.start();
}
if(moonMultiThread==null){
moonMultiThread=newThread(this);
moonMultiThread.start();
}
}
publicvoidstop(){
if(earthMultiThread!
=null){
earthMultiThread.stop();
earthMultiThread=null;
}
if(moonMultiThread!
=null){
moonMultiThread.stop();
moonMultiThread=null;
}
}
publicvoidloadAllEarthImage(){
guiGraphics=getGraphics();
allImagesArray=newImage[NUMBER_IMAGES];
MediaTrackertracker=newMediaTracker(this);
StringstrImage;
for(intcurrentIndex=1;currentIndex<=NUMBER_IMAGES;
currentIndex++){
strImage="/images/img00"+((currentIndex<10)?
"0":
"")
+currentIndex+".gif";
URLoneImageURL=getClass().getResource(strImage);
if(isRunedByApplication){
allImagesArray[currentIndex-1]=
Toolkit.getDefaultToolkit().getImage(oneImageURL);
}
else{
allImagesArray[currentIndex-1]=getImage(oneImageURL);
}
tracker.addImage(allImagesArray[currentIndex-1],0);
}
try{
tracker.waitForAll();
}catch(InterruptedExceptione){
e.printStackTrace();
}
allImagesLoaded=!
tracker.isErrorAny();
if(!
allImagesLoaded){
stop();
guiGraphics.drawString("图像加载错误,可能是没有找到文件!
",10,40);
return;
}
imageWidth=allImagesArray[0].getWidth(this);
imageHeight=allImagesArray[0].getHeight(this);
earthCenterX0=(getSize().width-imageWidth)/2;
earthCenterY0=(getSize().height-imageHeight)/2;
}//在这里初始化
publicvoidrun(){
if(!
allImagesLoaded){
loadAllEarthImage();
}
repaint();
while(true){
try{
displayImage(guiGraphics);
currentImageIndex++;
if(currentImageIndex==NUMBER_IMAGES)
currentImageIndex=0;
if(Thread.currentThread()==earthMultiThread){
Thread.sleep(50);
}
else{
Thread.sleep(500);
}
}
catch(InterruptedExceptione){
stop();
}
}
}
privatevoiddisplayImage(Graphicsg){
if(!
allImagesLoaded)
return;
//earthCenterX0=(getSize().width-imageWidth)/2;
//earthCenterY0=(getSize().height-imageHeight)/2;
if(Thread.currentThread()==earthMultiThread){
g.drawImage(allImagesArray[currentImageIndex],
earthCenterX0,earthCenterY0,null);
}
else{
g.clearRect((int)(earthCenterX0+circleRadius*Math.cos((currentRotatingAngle-1)*Math.PI/180)),
(int)(earthCenterY0+circleRadius*Math.sin((currentRotatingAngle-1)*Math.PI/180)),
imageWidth,imageHeight);
g.drawImage(allImagesArray[currentImageIndex],
(int)(earthCenterX0+circleRadius*Math.cos(currentRotatingAngle*Math.PI/180)),
(int)(earthCenterY0+circleRadius*Math.sin(currentRotatingAngle*Math.PI/180)),
imageWidth/2,imageHeight/2,
null);//注意调整下面的XY坐标,否则轨迹会被覆盖
g.drawLine((int)(earthCenterX0+(circleRadius-10)*Math.cos(currentRotatingAngle*Math.PI/180)),
(