亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java編程實(shí)現(xiàn)的模擬行星運(yùn)動(dòng)示例

 更新時(shí)間:2018年04月22日 12:56:13   作者:wangbowj123  
這篇文章主要介紹了Java編程實(shí)現(xiàn)的模擬行星運(yùn)動(dòng),涉及java基于swing組建繪制動(dòng)態(tài)效果及數(shù)值運(yùn)算相關(guān)操作技巧,并總結(jié)分析了java面向?qū)ο蟮南嚓P(guān)特性,需要的朋友可以參考下

本文實(shí)例講述了Java編程實(shí)現(xiàn)的模擬行星運(yùn)動(dòng)。分享給大家供大家參考,具體如下:

期待了很久的Java語言程序設(shè)計(jì)也拉下了帷幕,在幾個(gè)月的時(shí)間里基本掌握了java的簡(jiǎn)單用法,學(xué)習(xí)了java的主要基礎(chǔ)知識(shí),面向?qū)ο笏枷?,多線程并發(fā)控制,swing界面設(shè)計(jì),動(dòng)畫制作等,最后結(jié)課了也打算制作一個(gè)課程設(shè)計(jì)能夠盡可能多的涵蓋所學(xué)知識(shí),將其進(jìn)行串聯(lián),因此考慮實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的模擬行星運(yùn)動(dòng)的小軟件,主要思路如下:

利用動(dòng)畫實(shí)現(xiàn)行星運(yùn)動(dòng)的模擬,主面板里有一個(gè)中心行星,同時(shí)繪制了橢圓軌道,有一顆運(yùn)動(dòng)的行星圍繞著中心行星運(yùn)動(dòng)。同時(shí)右下角設(shè)置的有四個(gè)按鈕,即“Start”、“Pause”、“accelerate”和“decelerate”分別可以使行星運(yùn)動(dòng)、暫停、加速、減速。

一、類的設(shè)計(jì):

Star繼承自JPanel。Star類是行星的基類,所有運(yùn)動(dòng)的行星都是繼承自Star類。內(nèi)部draw()方法主要繪制了一個(gè)實(shí)心圓形,目的是在每次繪制時(shí),可以保證中心行星始終顯示。paintComponent()方法重寫了JPanel的繪制方法,目的是保證繼承自Star類的Stars類的實(shí)例對(duì)象可以繪制出自己的行星。如下:

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類,是對(duì)Star類的進(jìn)一步細(xì)化,表示運(yùn)動(dòng)的行星。Stars類中的alfa表示運(yùn)動(dòng)行星的運(yùn)動(dòng)起始角度,speed表示運(yùn)動(dòng)速度,可對(duì)其進(jìn)行修改。Long,Short分別表示橢圓軌跡的長(zhǎng)軸與短軸。center表示其實(shí)例化對(duì)象的中心行星。paintComponent()函數(shù)重寫了paintComponent(),內(nèi)部引用了父類的draw()函數(shù),并且根據(jù)Long,,Short繪制了橢圓軌道,Long、Short由實(shí)例化對(duì)象調(diào)用構(gòu)造方法來決定。move()函數(shù)描述了x,y的變化方程,即圍繞著橢圓軌道變化,同時(shí)規(guī)定了alfa的變化方式。start()函數(shù)表示線程開始,pause()函數(shù)表示線程暫停,accelerate()函數(shù)表示對(duì)行星的加速操作,decelerate()函數(shù)表示對(duì)行星減速的操作。

Pthread類目的是控制線程,即通過對(duì)Pthread類的實(shí)例化可以控制行星的開始運(yùn)動(dòng),暫停運(yùn)動(dòng),加速,減速。Pthread類繼承自Thread類,且包含于Starts類中,因而,PThread類不能被定義為共有類。PThread類提供了run()方法,不斷調(diào)用repaint()方法,對(duì)畫面進(jìn)行重新繪制。setsuspend()方法利用改變boolean變量對(duì)線程進(jìn)行暫停操作(調(diào)用notifyall()方法)。因?yàn)镻thread類是Starts的內(nèi)部類,所以之后Starts類中將生成一個(gè)PThread類的對(duì)象,并且利用該對(duì)象,對(duì)線程進(jìn)行操作。

設(shè)計(jì)如下:

package Star;
import java.awt.Color;
import java.awt.Graphics;
public class Stars extends Star{
  /**
   * 運(yùn)動(dòng)的行星
   */
  private static final long serialVersionUID = 1L;
  double alfa ;
  double speed ;
  Star center;
  int Long ; //長(zhǎng)軸
  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);//畫出中心點(diǎn)
    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));
    //沿橢圓軌跡運(yùn)行
    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){
      //設(shè)置線程暫停方法
       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.0002
      speed += 0.0002;
    }
    else
      speed = 0.001;
  }
  public void decelerate(){
    //減速的方法
    if(speed > 0){
      speed -= 0.0002;
      //角度每次減速0.0002
    }
    //若減速到0,則不能繼續(xù)減速,另速度為0,停止運(yùn)動(dòng)
    else speed = 0;
  }
}

StarFrame類是本程序的啟動(dòng)面板,通過實(shí)例化該類,生成主程序界面,并且將行星部件,按鈕,標(biāo)簽添加進(jìn)面板。內(nèi)部的getPanel()方法對(duì)兩個(gè)按鈕進(jìn)行了設(shè)置,并且返回一個(gè)JPanel(將四個(gè)按鈕添加進(jìn)該JPanel中)。getLabel()方法返回一個(gè)文字描述的JLabel。Center對(duì)象是Star類的實(shí)例化,p1是Stars類的實(shí)例化,分別表示中心行星與環(huán)繞行星。jb1,jb2,jb3,jb4分別是行星的啟動(dòng),暫停,加速,減速的控制按鈕。image表示界面背景圖,LayeredPanel是界面的層次面板,方便背景圖的設(shè)置。jp,jl是設(shè)置背景圖的部件。設(shè)計(jì)如下:

package Star;
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{
  /**
   *行星模擬啟動(dòng)面板
   */
  private static final long serialVersionUID = 1L;
  Star center = new Star(300,200);//定義中心行星
  Stars p1 = new Stars(300+230,200+130,center);//環(huán)繞中心的行星
  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");//背景圖,利用相對(duì)路徑定義
  JLayeredPane layeredPane; //定義一個(gè)層次面板,用于放置背景圖片
  JPanel jp;
  JLabel jl;
  public StarFrame(){
    //為p1設(shè)置位置,與大小
    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設(shè)置相關(guān)動(dòng)作
    jb1.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        p1.start();
      }
    }
    );
    jb2.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        p1.pause();
      }
    });
    jb3.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        p1.accelerate();
      }
    });
    jb4.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        p1.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(){
    //返回定義的四個(gè)按鈕
    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);//設(shè)置字體顏色
    jl.setFont(new Font("Dialog",0,20));//設(shè)置字體
    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();
  }
}

運(yùn)行效果:

二、對(duì)象:

因?yàn)閖ava是面向?qū)ο蟮恼Z言,當(dāng)然不能像c語言一樣,僅僅靠函數(shù)實(shí)現(xiàn),課設(shè)里豈能沒有對(duì)象?

主要對(duì)象:

對(duì)象center,即中心行星

對(duì)象p1,即環(huán)繞行星

對(duì)象pt,即負(fù)責(zé)控制線程的對(duì)象

對(duì)象f,即程序啟動(dòng)面板

三、對(duì)象之間的關(guān)系(交互)

p1與center的關(guān)系:Star類是行星的基類,繼承自JPanel,其內(nèi)部定義了基本的半徑與坐標(biāo),其實(shí)例化對(duì)象center即是運(yùn)動(dòng)行星的中心行星。而繼承自Star的Stars類表示運(yùn)動(dòng)行星,是其進(jìn)一步的細(xì)化,因此其實(shí)例化對(duì)象p1表示運(yùn)動(dòng)的行星1,且圍繞著center運(yùn)動(dòng),同時(shí)center作為參數(shù)傳遞給p1的構(gòu)造方法,完成二者交互。對(duì)象p1與center便是這樣的關(guān)系。實(shí)例化對(duì)象center后,便會(huì)在指定坐標(biāo)下繪制實(shí)心圓形,center對(duì)象的x,y坐標(biāo)不會(huì)變化。而對(duì)象p1在實(shí)現(xiàn)繪制實(shí)心圓形的基礎(chǔ)上,又根據(jù)center的坐標(biāo)繪制了指定長(zhǎng)軸,短軸的橢圓軌道,同時(shí)其內(nèi)部實(shí)現(xiàn)了Thread類,不中斷的執(zhí)行線程。相互的繼承關(guān)系,使得center和p1可以互不干擾的繪制圖形,值得一提的是,在Stras類中的paintComponent()方法中,仍需要調(diào)用center對(duì)象的draw()方法,因?yàn)榫€程開始時(shí)會(huì)調(diào)用repaint()方法,如果不實(shí)現(xiàn)center的draw()方法,那么最終結(jié)果將不會(huì)顯示中心行星。

pt與p1的關(guān)系:PThread類繼承自Thread類,定義了run()方法,通過其實(shí)例化對(duì)象p1,可以調(diào)用start()方法啟動(dòng)線程,而PThread類在Starts類內(nèi)部,因而通過p1內(nèi)的方法可以控制線程,即控制其速度,加速減速,控制其運(yùn)行與否。

f與各對(duì)象的關(guān)系:StarFrame繼承自JFrame,其實(shí)例化對(duì)象f將各對(duì)象添加進(jìn)繪畫布里,制作了界面,并控制了每個(gè)部件的大小、位置,是程序運(yùn)行的關(guān)鍵。

四、面向?qū)ο蟮睦斫猓?/strong>

萬物皆對(duì)象,有些同學(xué)問我到底什么才是對(duì)象,我回答說有new的都是對(duì)象,對(duì)象便是類的實(shí)例化,本程序中,可以通過對(duì)Stars類進(jìn)行實(shí)例化從而創(chuàng)造出無數(shù)多個(gè)行星(理論上是的),但是內(nèi)部函數(shù)的實(shí)現(xiàn)有些問題難以解決,主要便在paintComponent()方法的重寫上,再次創(chuàng)建對(duì)象后,便會(huì)再次重寫該方法,于是會(huì)出現(xiàn)不可避免的問題,也是無法解決的一個(gè)遺憾!

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java設(shè)計(jì)模式之單例模式簡(jiǎn)析

    Java設(shè)計(jì)模式之單例模式簡(jiǎn)析

    這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式簡(jiǎn)析,單例模式是常用的設(shè)計(jì)模式,在我們的系統(tǒng)乃至在框架中都普遍被用到,單例模式就是使一個(gè)類有且只有一個(gè)實(shí)例用于外部訪問,這樣大大的節(jié)省了系統(tǒng)的資源,需要的朋友可以參考下
    2023-12-12
  • Spring batch批處理框架

    Spring batch批處理框架

    本文主要介紹了Spring batch批處理框架的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-04-04
  • Java中String、StringBuffer、StringBuilder的區(qū)別介紹

    Java中String、StringBuffer、StringBuilder的區(qū)別介紹

    這篇文章主要介紹了Java中String、StringBuffer、StringBuilder的區(qū)別介紹,本文講解了可變與不可變、是否多線程安全、gBuilder與StringBuffer共同點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • Java如何打印完整的堆棧信息

    Java如何打印完整的堆棧信息

    這篇文章主要為大家介紹了Java如何打印完整的堆棧信息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • springmvc攔截器登錄驗(yàn)證示例

    springmvc攔截器登錄驗(yàn)證示例

    本篇文章主要介紹了springmvc攔截器登錄驗(yàn)證示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • SpringSecurity解決POST方式下CSRF問題

    SpringSecurity解決POST方式下CSRF問題

    本文主要介紹了SpringSecurity解決POST方式下CSRF問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 帶你了解Java的類和對(duì)象

    帶你了解Java的類和對(duì)象

    下面小編就為大家?guī)硪黄胬斫釰ava類和對(duì)象。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-09-09
  • SpringBoot 快速實(shí)現(xiàn) api 加密的方法

    SpringBoot 快速實(shí)現(xiàn) api 加密的方法

    在項(xiàng)目中,為了保證數(shù)據(jù)的安全,我們常常會(huì)對(duì)傳遞的數(shù)據(jù)進(jìn)行加密,常用的加密算法包括對(duì)稱加密(AES)和非對(duì)稱加密(RSA),本文給大家介紹SpringBoot 快速實(shí)現(xiàn) api 加密,感興趣的朋友一起看看吧
    2023-10-10
  • Spring通過配置文件管理Bean對(duì)象的方法

    Spring通過配置文件管理Bean對(duì)象的方法

    這篇文章主要介紹了Spring通過配置文件管理Bean對(duì)象的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Java編寫實(shí)現(xiàn)坦克大戰(zhàn)小游戲

    Java編寫實(shí)現(xiàn)坦克大戰(zhàn)小游戲

    這篇文章主要為大家詳細(xì)介紹了Java編寫實(shí)現(xiàn)坦克大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論