月亮绕地球转

//Sky.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Sky extends JLabel implements ActionListener {   //标签类JLabel的子类--刻画天空
   Earth earth;                            
   Timer timer;                                               //计时器
   double pointX[]=new double[360],                           //double型数组pointX刻画水平坐标-地球相对于天空的
          pointY[]=new double[360];                           //double型数组pointY刻画垂直坐标-地球相对于天空的
   int w=400,h=400,i=0;
   Sky() {
     timer=new Timer(100,this);                               //创建timer--振铃间隔是100毫秒--当前Sky对象为其监视器
     earth = new Earth();                                     //构造了一个地球(实际上是一个标签对象)
     earth.setSize(200,200);                                  //地球(标签对象)大小为200*200
     add(earth);                                              //地球位于刻画天空的标签里(标签也可以是容器)
     pointX[0]=0;                                             //地球运动轨道的半径h/2
     pointY[0]=h/2; 
     double angle=1*Math.PI/180;                                          //刻度为1度-弧度 
     for(int i=0;i<359;i++) {                                             //计算出数组中各个元素的值--圆上的坐标点
       pointX[i+1]=pointX[i]*Math.cos(angle)-pointY[i]*Math.sin(angle);   //以圆中心为(0,0),第一个点为(0,h/2),顺时
       pointY[i+1]=pointY[i]*Math.cos(angle)+pointX[i]*Math.sin(angle);   //针旋转1弧度后的坐标
     }
     for(int i=0;i<360;i++) {           
       pointX[i]=0.5*pointX[i]+w/2;                                       //坐标缩放平移--将圆中心变为(w/2,h/2)
       pointY[i]=0.5*pointY[i]+h/2;                                       //轨道圆大小缩小1倍
     }
     timer.start();                                                       //计时器启动--每隔100毫秒就会触发ActionEvent
   }
   public void actionPerformed(ActionEvent e) {
       i=(i+1)%360;                                                       //0~359循环变化
       earth.setLocation((int)pointX[i]-100,(int)pointY[i]-100);          //设置earth对象(标签)在sky对象(标签)上的位置
   }
}

//Earth.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Earth extends JLabel implements ActionListener {  //标签类JLabel的子类--刻画地球
   JLabel moon;                                                //标签类--刻画(显示)月亮的外观
   Timer timer;                                                //计时器
   double pointX[]=new double[360],                            //double型数组pointX刻画水平坐标-月亮相对于地球的        
          pointY[]=new double[360];                            //double型数组pointY刻画垂直坐标-月亮相对于地球的
   int w=200,h=200,i=0;
   Earth() {
     timer=new Timer(20,this);//【代码1】                                 //创建timer,振铃间隔是20毫秒当前Earth对象为其监视器    
     setIcon(new ImageIcon("earth.jpg"));                      //设置地球(标签)的图标为earth.jpg
     setHorizontalAlignment(SwingConstants.CENTER);                       //设置地球(标签)对齐方式为居中
     moon=new JLabel(new ImageIcon("moon.jpg"),SwingConstants.CENTER);    //构造月亮(标签)对象
     moon.setSize(60,60);                                                 //设置月亮(标签)大小
     add(moon);//【代码2】                                                           //月亮(标签)放到刻画地球的标签对象里
     pointX[0]=0;                                                         //月亮运动轨道的半径h/2
     pointY[0]=h/2;
     double angle=1*Math.PI/180;                                          //刻度为1度 
     for(int i=0;i<359;i++) {                                             //计算出数组中各个元素的值--圆上的坐标点
       pointX[i+1]=pointX[i]*Math.cos(angle)-pointY[i]*Math.sin(angle);   //以圆中心为(0,0),第一个点为(0,h/2),顺时
       pointY[i+1]=pointY[i]*Math.cos(angle)+pointX[i]*Math.sin(angle);   //针旋转1弧度后的坐标
     }
     for(int i=0;i<360;i++) {           
       pointX[i]=0.8*pointX[i]+w/2;                                       //坐标缩放平移--将圆中心变为(w/2,h/2)    
       pointY[i]=0.8*pointY[i]+h/2;                                       //轨道圆大小缩小1倍
     }
     timer.start();//【代码3】                                                       //计时器启动--每隔100毫秒就会触发ActionEvent
   }
   public void actionPerformed(ActionEvent e) { 
       i=(i+1)%360;                                                       //0~359循环变化
       moon.setLocation((int)pointX[i]-30,(int)pointY[i]-30);             //设置moon对象(标签)在earth对象(标签)上的位置
   }
}

//MainClass.java

import javax.swing.*;
public class MainClass {
      public static void main(String args[]) {
      Sky sky= new Sky();                                            //构造了一个天空(标签对象)
      JFrame frame = new JFrame();                                   //构造了一个框架(窗体)
      frame.setTitle("月亮绕地球转");
      frame.add(sky);                                                //将天空(标签)置于框架(窗体)里
      frame.setSize(400,300);
      frame.setVisible(true);
      frame.setLocationRelativeTo(null);                             //设置窗体的位置--居中
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().setBackground(java.awt.Color.white);    //将窗体转换为一个容器并设置其背景色为白色
    }
}

earth.jpg       moon.jpg

转载于:https://www.cnblogs.com/liao-pxsoftware15/p/7523849.html

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一个简单的Java Swing程序,用于演示地球太阳月亮地球的过程: ```java import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class SolarSystem extends JPanel implements ActionListener { private final int WIDTH = 800; private final int HEIGHT = 600; private final int EARTH_RADIUS = 30; private final int MOON_RADIUS = 10; private final int SUN_RADIUS = 50; private final double EARTH_ORBIT_RADIUS = 200; private final double MOON_ORBIT_RADIUS = 50; private double earthAngle = 0; private double moonAngle = 0; public SolarSystem() { Timer timer = new Timer(10, this); timer.start(); } @Override public void actionPerformed(ActionEvent e) { earthAngle += 0.01; moonAngle += 0.05; repaint(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.BLACK); g.fillRect(0, 0, WIDTH, HEIGHT); Point center = new Point(WIDTH / 2, HEIGHT / 2); // 画太阳 g.setColor(Color.YELLOW); g.fillOval(center.x - SUN_RADIUS, center.y - SUN_RADIUS, SUN_RADIUS * 2, SUN_RADIUS * 2); // 画地球 int earthX = (int) (center.x + EARTH_ORBIT_RADIUS * Math.cos(earthAngle)); int earthY = (int) (center.y + EARTH_ORBIT_RADIUS * Math.sin(earthAngle)); g.setColor(Color.BLUE); g.fillOval(earthX - EARTH_RADIUS, earthY - EARTH_RADIUS, EARTH_RADIUS * 2, EARTH_RADIUS * 2); // 画月亮 int moonX = (int) (earthX + MOON_ORBIT_RADIUS * Math.cos(moonAngle)); int moonY = (int) (earthY + MOON_ORBIT_RADIUS * Math.sin(moonAngle)); g.setColor(Color.GRAY); g.fillOval(moonX - MOON_RADIUS, moonY - MOON_RADIUS, MOON_RADIUS * 2, MOON_RADIUS * 2); } public static void main(String[] args) { JFrame frame = new JFrame("Solar System"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 600); frame.add(new SolarSystem()); frame.setVisible(true); } } ``` 在这个程序中,我们使用了Java Swing中的JPanel类来实现画图功能,并利用Timer类来实现动画效果。程序中有几个常量,分别代表了地球月亮和太阳的半径以及它们的轨道半径。在paintComponent方法中,我们首先用黑色填充整个面板,然后画出太阳、地球月亮。太阳是一颗黄色的圆,地球月亮则通过计算它们在轨道上的位置来画出来。通过不断改变地球月亮的角度,我们就可以实现它们着太阳和地球动的效果。 运行程序,即可看到地球月亮太阳和地球的效果。 ### 回答2: 要使用AWT或Swing设计一个地球太阳月亮地球的程序,可以按照以下步骤进行: 1. 创建一个主窗口,并设置好窗口的大小、标题等属性。 2. 在主窗口中创建一个自定义的“太阳面板”来表示太阳。可以使用Java绘图工具(如Graphics类)在面板上绘制一个黄色的圆形。 3. 在主窗口中创建一个自定义的“地球面板”来表示地球。可以使用Graphics在面板上绘制一个蓝色的圆形。 4. 在地球面板中再创建一个“月亮面板”来表示月亮。可以使用Graphics在面板上绘制一个灰色的圆形。 5. 定义一个定时器,每隔一段时间(如100毫秒)触发一次,并在事件中更新太阳、地球月亮面板的位置。 6. 在定时器事件中,可以根据一定的速度和角度计算出太阳、地球月亮的新位置,并使用repaint()方法重新绘制面板。 7. 为了实现地球太阳月亮地球的效果,可以设置不同的角速度和半径参数,并在计算新位置时使用不同的角度。 8. 最后,将太阳面板、地球面板和月亮面板添加到主窗口中,并使用布局管理器来确定它们之间的位置关系和大小。 通过以上步骤,就可以设计一个利用AWT或Swing实现地球太阳月亮地球的程序。在运行程序时,太阳、地球月亮将会按照设定的速度和轨迹运动,从而展现出宇宙中天体运行的奇妙景象。 ### 回答3: 使用Java中的AWT或Swing库,我们可以设计一个地球太阳月亮地球的程序。 首先,我们需要创建一个窗口来显示地球、太阳和月亮。可以使用 JFrame 类来创建一个窗口,然后在窗口中添加绘制图形的组件。 接下来,我们需要定义地球、太阳和月亮的位置和大小。这可以通过定义相应的变量来实现。例如,可以使用坐标和半径来表示地球、太阳和月亮的位置和大小。在程序中,我们可以使用 data 类型(例如,整数或浮点数)来存储这些信息。 然后,我们需要在窗口上绘制地球、太阳和月亮。可以使用 Java 的绘图类来完成这个任务。例如,可以使用 Graphics 类的方法(例如 drawOval())来绘制圆形来表示地球、太阳和月亮。 为了使地球月亮太阳和地球动,我们可以使用定时器。在每个时间间隔内,我们可以更新地球月亮的位置和角度,然后重新绘制它们。可以使用 javax.swing.Timer 类来创建一个定时器,然后为它设置一个固定的时间间隔,以更新图形的位置和角度。 最后,我们需要运行程序,并观察地球太阳月亮地球的效果。可以使用主方法来启动程序。 这样,我们就可以使用AWT或Swing库设计一个地球太阳月亮地球的程序了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值