国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java編程實現的模擬行星運動示例

Java編程實現的模擬行星運動示例

2021-04-23 11:16wangbowj123 Java教程

這篇文章主要介紹了Java編程實現的模擬行星運動,涉及java基于swing組建繪制動態效果及數值運算相關操作技巧,并總結分析了java面向對象的相關特性,需要的朋友可以參考下

本文實例講述了java編程實現的模擬行星運動。分享給大家供大家參考,具體如下:

期待了很久的java語言程序設計也拉下了帷幕,在幾個月的時間里基本掌握了java的簡單用法,學習了java的主要基礎知識,面向對象思想,多線程并發控制,swing界面設計,動畫制作等,最后結課了也打算制作一個課程設計能夠盡可能多的涵蓋所學知識,將其進行串聯,因此考慮實現了一個簡單的模擬行星運動的小軟件,主要思路如下:

利用動畫實現行星運動的模擬,主面板里有一個中心行星,同時繪制了橢圓軌道,有一顆運動的行星圍繞著中心行星運動。同時右下角設置的有四個按鈕,即“start”、“pause”、“accelerate”和“decelerate”分別可以使行星運動、暫停、加速、減速。

一、類的設計:

star繼承自jpanel。star類是行星的基類,所有運動的行星都是繼承自star類。內部draw()方法主要繪制了一個實心圓形,目的是在每次繪制時,可以保證中心行星始終顯示。paintcomponent()方法重寫了jpanel的繪制方法,目的是保證繼承自star類的stars類的實例對象可以繪制出自己的行星。如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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類的對象,并且利用該對象,對線程進行操作。

設計如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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.0002
      speed += 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是設置背景圖的部件。設計如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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{
  /**
   *行星模擬啟動面板
   */
  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 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(){
    //返回定義的四個按鈕
    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編程實現的模擬行星運動示例

二、對象:

因為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程序設計有所幫助。

原文鏈接:https://blog.csdn.net/wangbowj123/article/details/76472789

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产高清一区二区 | 国产综合亚洲精品一区二 | 欧美成人精品一区二区三区 | 国产欧美精品区一区二区三区 | 午夜伦4480yy私人影院 | 自拍偷拍专区 | av一区二区三区四区 | 成人毛片在线观看视频 | 日日嗨av一区二区三区四区 | 久久99精品久久久久久国产越南 | 99综合在线 | 亚洲二区在线观看 | 日精品| 在线一区二区免费 | 日韩精品一区二区三区第95 | 亚洲免费观看视频 | 精品久久中文字幕 | 亚洲黄色免费 | 牛牛电影国产一区二区 | 国产精品久久久久久 | 国产精品美女久久久久久免费 | 91精品国产91久久久久 | 天天爽夜夜爽夜夜爽精品视频 | 在线a视频 | 国产精品久久嫩一区二区免费 | 天天拍拍天天干 | 亚洲91精品 | 日韩成人在线观看 | 99热这里有精品 | 精品久久久久久亚洲精品 | 激情一区二区 | 亚洲自拍偷拍网 | 欧美一区在线观看视频 | jizzxxx日本 | 午夜草逼| 欧美一区二区三区久久精品 | 求av网址| 中文字幕精品一区二区三区精品 | 一本大道av伊人久久综合 | 国产精品国产自产拍高清av | 91久久在线 |