期待了很久的Java语言程序设计也拉下了帷幕,在几个月的时间里基本掌握了java的简单用法,学习了java的主要基础知识,面向对象思想,多线程并发控制,swing界面设计,动画制作等,最后结课了也打算制作一个课程设计能够尽可能多的涵盖所学知识,将其进行串联,因此考虑实现了一个简单的模拟行星运动的小软件,主要思路如下:

利用动画实现行星运动的模拟,主面板里有一个中心行星,同时绘制了椭圆轨道,有一颗运动的行星围绕着中心行星运动。同时右下角设置的有四个按钮,即“Start”、“Pause”、“accelerate”和“decelerate”分别可以使行星运动、暂停、加速、减速。

一、类的设计:

Star继承自JPanel。Star类是行星的基类,所有运动的行星都是继承自Star类。内部draw()方法主要绘制了一个实心圆形,目的是在每次绘制时,可以保证中心行星始终显示。paintComponent()方法重写了JPanel的绘制方法,目的是保证继承自Star类的Stars类的实例对象可以绘制出自己的行星。如下:

package Star;import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;public class Star extends JPanel{/*** 基本的行星类*/private static final long serialVersionUID = 1L;int x,y;int width,height;public Star() {width = 10;height = 10;}public Star(int x, int y){this.x = x;this.y = y;width = 10;height = 10;}public void draw(Graphics g){g.setColor(Color.blue);g.fillOval(x, y, width, height);}protected void paintComponent(Graphics g){super.paintComponent(g);g.fillOval(x, y, width, height);}
}

Stars类继承自Star类,是对Star类的进一步细化,表示运动的行星。Stars类中的alfa表示运动行星的运动起始角度,speed表示运动速度,可对其进行修改。Long,Short分别表示椭圆轨迹的长轴与短轴。center表示其实例化对象的中心行星。paintComponent()函数重写了paintComponent(),内部引用了父类的draw()函数,并且根据Long,,Short绘制了椭圆轨道,Long、Short由实例化对象调用构造方法来决定。move()函数描述了x,y的变化方程,即围绕着椭圆轨道变化,同时规定了alfa的变化方式。start()函数表示线程开始,pause()函数表示线程暂停,accelerate()函数表示对行星的加速操作,decelerate()函数表示对行星减速的操作。

Pthread类目的是控制线程,即通过对Pthread类的实例化可以控制行星的开始运动,暂停运动,加速,减速。Pthread类继承自Thread类,且包含于Starts类中,因而,PThread类不能被定义为共有类。PThread类提供了run()方法,不断调用repaint()方法,对画面进行重新绘制。setsuspend()方法利用改变boolean变量对线程进行暂停操作(调用notifyall()方法)。因为Pthread类是Starts的内部类,所以之后Starts类中将生成一个PThread类的对象,并且利用该对象,对线程进行操作。

设计如下:

package Star;import java.awt.Color;
import java.awt.Graphics;public class Stars extends Star{/*** 运动的行星*/private static final long serialVersionUID = 1L;double alfa ;double speed ;Star center;int Long ; //长轴int Short;//短轴public Stars(int Px,int Py,Star center){super(Px,Py);this.center = center;Long = (Px - center.x)*2;Short = (Py - center.y)*2;this.setOpaque(true);
//      move();alfa = 0;speed = 0.001;}protected void paintComponent(Graphics g){super.paintComponent(g);center.draw(g);//画出中心点move();g.setColor(Color.GREEN);g.drawOval(center.x-Long/2, center.y-Short/2, Long, Short);}public void move(){x = center.x + (int)(Long/2*Math.cos(alfa));y = center.y + (int)(Short/2*Math.sin(alfa));//沿椭圆轨迹运行alfa += speed; //角度不断变化}class PThread extends Thread{ //重画线程类private boolean suspend = true;private String control = "";public void run(){while(true){synchronized (control) {if(suspend){//move();repaint();}}}}public void setsuspend(boolean s){//设置线程暂停方法if (!suspend) {synchronized (control) {control.notifyAll();}}this.suspend = s;}}public PThread pt = new PThread();public void start(){pt.setsuspend(true);pt.start();}public void pause(){pt.setsuspend(false);}public void accelerate(){//加速的方法if(speed > 0){//角度每次加速0.0002speed += 0.0002;}else speed = 0.001;}public void decelerate(){//减速的方法if(speed > 0){speed -= 0.0002;//角度每次减速0.0002}//若减速到0,则不能继续减速,另速度为0,停止运动else speed = 0;}
}

StarFrame类是本程序的启动面板,通过实例化该类,生成主程序界面,并且将行星部件,按钮,标签添加进面板。内部的getPanel()方法对两个按钮进行了设置,并且返回一个JPanel(将四个按钮添加进该JPanel中)。getLabel()方法返回一个文字描述的JLabel。Center对象是Star类的实例化,p1是Stars类的实例化,分别表示中心行星与环绕行星。jb1,jb2,jb3,jb4分别是行星的启动,暂停,加速,减速的控制按钮。image表示界面背景图,LayeredPanel是界面的层次面板,方便背景图的设置。jp,jl是设置背景图的部件。设计如下:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;public class StarFrame extends JFrame{/***行星模拟启动面板 */private static final long serialVersionUID = 1L;Star center = new Star(300,200);//定义中心行星Stars p1 = new Stars(300+230,200+130,center);//环绕中心的行星Stars p2 = new Stars(300+230+20,200+130+20,p1);JButton jb1 = new JButton("start");JButton jb2 = new JButton("pause");JButton jb3 = new JButton("accelerate");JButton jb4 = new JButton("decelerate");ImageIcon image=new ImageIcon("timg.jpg");//背景图,利用相对路径定义JLayeredPane layeredPane; //定义一个层次面板,用于放置背景图片JPanel jp;  JLabel jl;  public StarFrame(){//为p1设置位置,与大小p1.setBounds(40,40,600,400);
//      p2.setBounds(40,40,600,400);//定义背景图,将背景图放于JLabel中,将JLabel放于JPanel中layeredPane = new JLayeredPane();        jp = new JPanel();  jp.setBounds(0,0,image.getIconWidth(),image.getIconHeight());  jl=new JLabel(image);  jp.add(jl);//将jp放到最底层。layeredPane.add(jp,JLayeredPane.DEFAULT_LAYER);  //将jb放到高一层的地方  layeredPane.add(p1,JLayeredPane.MODAL_LAYER);
//      layeredPane.add(p2,JLayeredPane.MODAL_LAYER);  layeredPane.add(getPanel(),JLayeredPane.MODAL_LAYER);layeredPane.add(getLabel(),JLayeredPane.MODAL_LAYER);//分别为jb1、jb2、jb3、jb4设置相关动作jb1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubp1.start();}});jb2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubp1.pause();}});jb3.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubp1.accelerate();}});jb4.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubp1.decelerate();}});this.setLayeredPane(layeredPane); this.setTitle("Star");this.setBounds(100,100,1000, 600);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}private JPanel getPanel(){//返回定义的四个按钮JPanel jp = new JPanel();jp.add(jb1);jp.add(jb2);jp.add(jb3);jp.add(jb4);jp.setBounds(750,450,200,70);return jp;}private JPanel getLabel(){//返回文字描述JLabel jl = new JLabel("行星模拟");jl.setForeground(Color.RED);//设置字体颜色jl.setFont(new Font("Dialog",0,20));//设置字体JPanel jp = new JPanel();jp.add(jl,BorderLayout.CENTER);jp.setBounds(800,0,150,40);return jp;}public static void main(String[] args) {@SuppressWarnings("unused")StarFrame f = new StarFrame();}}

二、对象:

因为java是面向对象的语言,当然不能像c语言一样,仅仅靠函数实现,课设里岂能没有对象?

主要对象:

对象center,即中心行星

对象p1,即环绕行星

对象pt,即负责控制线程的对象

对象f,即程序启动面板

三、对象之间的关系(交互)

p1与center的关系:Star类是行星的基类,继承自JPanel,其内部定义了基本的半径与坐标,其实例化对象center即是运动行星的中心行星。而继承自Star的Stars类表示运动行星,是其进一步的细化,因此其实例化对象p1表示运动的行星1,且围绕着center运动,同时center作为参数传递给p1的构造方法,完成二者交互。对象p1与center便是这样的关系。实例化对象center后,便会在指定坐标下绘制实心圆形,center对象的x,y坐标不会变化。而对象p1在实现绘制实心圆形的基础上,又根据center的坐标绘制了指定长轴,短轴的椭圆轨道,同时其内部实现了Thread类,不中断的执行线程。相互的继承关系,使得center和p1可以互不干扰的绘制图形,值得一提的是,在Stras类中的paintComponent()方法中,仍需要调用center对象的draw()方法,因为线程开始时会调用repaint()方法,如果不实现center的draw()方法,那么最终结果将不会显示中心行星。

pt与p1的关系:PThread类继承自Thread类,定义了run()方法,通过其实例化对象p1,可以调用start()方法启动线程,而PThread类在Starts类内部,因而通过p1内的方法可以控制线程,即控制其速度,加速减速,控制其运行与否。

f与各对象的关系:StarFrame继承自JFrame,其实例化对象f将各对象添加进绘画布里,制作了界面,并控制了每个部件的大小、位置,是程序运行的关键。

四、面向对象的理解:

万物皆对象,有些同学问我到底什么才是对象,我回答说有new的都是对象,对象便是类的实例化,本程序中,可以通过对Stars类进行实例化从而创造出无数多个行星(理论上是的),但是内部函数的实现有些问题难以解决,主要便在paintComponent()方法的重写上,再次创建对象后,便会再次重写该方法,于是会出现不可避免的问题,也是无法解决的一个遗憾!

Java程序设计——模拟行星运动相关推荐

  1. java程序设计模拟题_《Java程序设计》东师模拟题题目及答案

    <Java程序设计>东师模拟题题目及答案 2020-08-30 09:08:37 931 有学员问关于<Java程序设计>东师模拟题题目及答案的题目的参考答案和解析,具体如下: ...

  2. 无忧考吧2017二级java_二级Java模拟软件|无忧考吧二级Java语言程序设计模拟软件下载 v2017.03官方版 - 121下载站...

    无忧考吧二级Java语言程序设计模拟软件是专为准备考试二级JAVA语言的朋友打造的一款在线模拟软件,二级JAVA语言的考试理论上是非常简单的, 大家只需要掌握基本的语法和一些简单的编程就可能了,这款软 ...

  3. 2021-2022学年度第二学期21级Java程序设计理论模拟考试

    说明:由于看pdf太难受了,重新编辑好放到博客上,方便自己复习,正确答案加粗标红 考试试卷 页码, 1/4 试卷名称:2021-2022学年度第二学期21级Java程序设计理论模拟考试(3.4.6班) ...

  4. 2016小码哥杯java程序设计竞赛赛前模拟题

    java程序设计赛前模拟题 一.单选题:(45分) 15题单选题,每题3分 第1题 单项选择题     代码片段: System.out.format("Pi is approximatel ...

  5. 第七届全国信息技术应用水平大赛模拟题 JAVA程序设计

    单选题(共60题,每题1分,共60分) 1. Java语言具有许多优点和特点,其中能反映Java程序在不同操作系统下都可以运行的特点是(). A.安全性 B.多线程 C.跨平台 D.可移植 2. Ja ...

  6. python模拟行星运动_Java课程设计——模拟行星运动

    期待了很久的Java语言程序设计也拉下了帷幕,在几个月的时间里基本掌握了java的简单用法,学习了java的主要基础知识,面向对象思想,多线程并发控制,swing界面设计,动画制作等,最后结课了也打算 ...

  7. 《Java程序设计》实验报告——Java的基本程序设计结构

    浙江理工大学 <Java程序设计>  实验报告  20 19-20 20学年第 1学期      学  院 信息学院 班  级 计算机科学技术18(3) 姓  名 申屠志刚 学  号 20 ...

  8. 20172325 2018-2019-1 《Java程序设计》第二周学习总结

    20172325 2018-2019-1 <Java程序设计>第二周学习总结 教材学习内容总结 3.1集合 集合是一种聚集.组织了其他对象的对象.集合可以分为两大类:线性集合和非线性集合. ...

  9. java语言模拟_Java语言模拟操作系统.doc

    河北大学2010级操作系统课程设计论文 PAGE PAGE 27 装订线 装 订 线 (指导教师用表) 学 生 姓 名 指 导 教 师 论文(设计)题目 Java语言模拟操作系统 主要研究 (设计)内 ...

最新文章

  1. python数据可视化利用_利用pyecharts实现python数据可视化
  2. 增加/dev/shm大小
  3. 一图揭示:营销的目的、策略、战略
  4. 介绍计算机硬件的英语作文带翻译,介绍我家的英语作文(带翻译)
  5. jquery检测浏览器类型
  6. AOP切入同类调用方法不起作用,AopContext.currentProxy()帮你解决这个坑
  7. Linux最全命令详解,请记下来!
  8. iOS开发之打包上传报错: ERROR ITMS-90087/ERROR ITMS-90125
  9. 机器学习系列-强填EM算法在理论与工程之间的鸿沟(下)
  10. git add 命令的一个习惯用法:逐个挑选改动
  11. 今晚直播丨一次特殊的 Oralce 硬解析性能问题的技术分享
  12. 网络自己发 sip invite_IP话机网页配置SIP账号
  13. 循环冗余检错码CRC
  14. JDK自带观察者的使用
  15. SourceOffsite安装配置
  16. HTML5 Audio时代的MIDI音乐文件播放 .
  17. 单片机中断程序详解(转)
  18. 双稳态一键开关机电路
  19. 解决微信屏蔽淘宝链接的方法
  20. 自然语言处理相关:英文词性缩写一览表

热门文章

  1. vijosP1567子串计数
  2. 适合学生用的蓝牙耳机哪款好?学生党无线蓝牙耳机推荐
  3. java实现can通信_[MicroPython]TPYBoard v102 CAN总线通信
  4. 华东,聚集中国最多的女药代
  5. TypeError: _typeof4 is not a function,解决微信小程序报错
  6. 计算机音乐谱毛不易,中国内地流行男歌手毛不易歌曲简谱精选
  7. ps绘画笔刷如何安装导入【一步步教你】
  8. Uber 《Go语言编程规范》学习笔记(一)
  9. 为何现在的程序员没工作动力,迷茫、中年危机普遍发生?
  10. 学习网络安全一头雾水,想找些学习资料都不知道哪里入手?