Dieser Artikel beschreibt die Simulation der durch Java -Programmierung implementierten Planetenbewegung. Teilen Sie es für Ihre Referenz wie folgt weiter:
Die Java -Sprachprogrammierung, auf die ich mich schon lange gefreut hatte, ist ebenfalls zu Ende gegangen. In ein paar Monaten habe ich die einfache Verwendung von Java im Grunde genommen gemeistert, das Hauptkenntnis von Java, objektorientiertem Denken, Multi-Thread-Contralrency-Kontrolle, Swing-Schnittstelle-Design, Animationsproduktion usw. schließlich vorhabe, ein Kursdesign zu erstellen, das so viel wie möglich wie möglich erlernt und in Serie verbinden kann. Daher habe ich darüber nachgedacht, eine einfache Software zu implementieren, um die Planetenbewegung zu simulieren. Die Hauptideen sind wie folgt:
Animation wird verwendet, um die Planetary -Bewegung zu simulieren. Es gibt einen zentralen Planeten im Hauptfeld, und es wird eine elliptische Umlaufbahn gezogen, und ein bewegter Planet bewegt sich um den zentralen Planeten. Gleichzeitig befinden sich in der unteren rechten Ecke vier Tasten, nämlich "Start", "Pause", "Beschleunigen" und "verlangsamen", die dazu führen können, dass sich Planeten bewegen, innehalten, beschleunigen und verlangsamt werden.
1. Klasse Design:
Star erbt von JPanel. Die Sternklasse ist die Basisklasse von Planeten, und alle beweglichen Planeten werden von der Sternklasse geerbt. Die interne Draw () -Methode zeichnet hauptsächlich einen soliden Kreis, und es ist der Zweck, sicherzustellen, dass der zentrale Planet jedes Mal, wenn er gezogen wird, immer anzeigt. Die PaintComponent () -Methode überschreibt die JPanel -Zeichnungsmethode und zielt darauf ab, sicherzustellen, dass Instanzobjekte der Sternenklasse, die aus der Sternenklasse geerbt wurden, ihre eigenen Planeten zeichnen können. wie folgt:
Paketstar; importieren java.awt.color; import Java.awt.graphics; import Javax.swing.jpanel; Public Class Star erweitert JPanel { / *** Basis planetarische Klasse* / private statische endgültige lange Serialversionuid = 1l; int x, y; int Breite, Höhe; public star () {width = 10; Höhe = 10; } public star (int x, int y) {this.x = x; this.y = y; Breite = 10; Höhe = 10; } public void Draw (Grafik g) {G.SetColor (color.Blue); G. -Filloval (x, y, Breite, Höhe); } Protected void PaintComponent (Grafik g) {Super.PaintComponent (g); G. -Filloval (x, y, Breite, Höhe); }}Die Sternenklasse erbt aus der Sternklasse, die eine weitere Verfeinerung der Sternklasse ist und sich bewegende Planeten darstellt. Die ALFA in der Sternenklasse repräsentiert den Startwinkel des beweglichen Planeten, und die Geschwindigkeit repräsentiert die Geschwindigkeit der Bewegung, die geändert werden kann. Lang und kurz repräsentieren die Hauptachse und die Nebenachse der elliptischen Flugbahn. Das Zentrum repräsentiert den zentralen Planeten seines sofortigen Objekts. Die Funktion PaintComponent () überschreibt PaintComponent (), bezieht sich intern auf die DRAG () -Funktion der übergeordneten Klasse und zeichnet die elliptische Spur nach langer, kurzer und langer und kurzer Ebene. Die Move () -Funktion beschreibt die Änderungsgleichung von x und y, dh Änderungen um die elliptische Umlaufbahn und legt auch die Art und Weise an, wie Alfa ändert. Die Funktion start () gibt den Start des Threads an, die Funktion pause () zeigt die Thread -Pause an, die Funktion der Beschleunigung () zeigt den Beschleunigungsvorgang auf dem Planeten an, und die Decelerate () -Funktion zeigt den Vorgang auf der Verzögerung des Planeten an.
Der Zweck der PThread -Klasse besteht darin, Threads, dh die anfängliche Bewegung, die Bewegung inne, zu beschleunigen und den Planeten durch Instanziierung der PThread -Klasse zu beschleunigen. Die PThread -Klasse erbt aus der Thread -Klasse und ist in der Startklasse enthalten. Daher kann die PThread -Klasse nicht als gemeinsame Klasse definiert werden. Die PThread -Klasse bietet eine Run () -Methode und ruft ständig die Repaint () -Methode auf, um das Bild neu zu streichen. Die Methode setSuSpend () verwendet die Änderung der booleschen Variablen, um den Thread zu pausieren (auf die musifyAll () -Methode aufrufen). Da es sich bei der PThread -Klasse um eine interne Startklasse handelt, wird ein Objekt der PThread -Klasse in der Startklasse generiert und der Thread wird mit diesem Objekt betrieben.
Das Design lautet wie folgt:
Paketstar; importieren java.awt.color; import Java.awt.graphics; Public Class Stars erweitert Stern { / *** bewegender Planet* / private statische endgültige lange Serialversionuid = 1L; Doppel -Alfa; doppelte Geschwindigkeit; Star Center; int lang; // Dunkeln Achse int Short; // öffentliche Sterne mit kurzer Achse (int px, int py, sterncenter) {super (px, py); this.center = center; Long = (px - center.x)*2; Short = (py - center.y)*2; this.setopaque (true); // move (); Alfa = 0; Geschwindigkeit = 0,001; } Protected void PaintComponent (Grafik g) {Super.PaintComponent (g); Center.Draw (g); // Zeichnen Sie den Center Point 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) (kurz/2*math.sin (alfa)); // Alfa entlang der elliptischen Flugbahn += Geschwindigkeit ausführen; // Der Winkel ändert sich ständig} Klasse PThread erweitert Thread {// Thread Class private boolean suspend = true; private String control = ""; public void run () {while (true) {synchronized (control) {if (suspend) {// move (); Repaint (); }}}} public void setsSopend (boolean s) {// Thread pause -Methode 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 () {// Beschleunigung der Methode if (Geschwindigkeit> 0) {// Winkelbeschleunigung 0,0002 Geschwindigkeit += 0,0002; } else speed = 0,001; } public void decelerate () {// Verurteilungsmethode if (Speed> 0) {Speed -= 0,0002; // Verzögerung in jedem Winkel 0,0002} // Wenn die Geschwindigkeit auf 0 verlangsamt wird, können Sie nicht weiter verlangsamt. Die Geschwindigkeit beträgt 0. STOP -Bewegung sonst Geschwindigkeit = 0; }}Die Starbrame -Klasse ist das Startpanel dieses Programms. Durch die Instanziierung dieser Klasse wird die Hauptprogrammschnittstelle generiert, und planetarische Komponenten, Schaltflächen und Etiketten werden dem Panel hinzugefügt. Die interne Getpanel () -Methode legt die beiden Tasten ein und gibt ein JPanel zurück (fügt vier Tasten in das JPanel hinzu). Die GetLabel () -Methode gibt ein JLabel mit einer buchstäblichen Beschreibung zurück. Das Mittelobjekt ist eine Instanziierung der Sternklasse, und P1 ist eine Instanziierung der Sternenklasse, die den zentralen Planeten bzw. des umlaufenden Planeten darstellt. JB1, JB2, JB3 und JB4 sind die Steuertasten zum Starten, Pause, Beschleunigen und Verzögerung des Planeten. Das Bild repräsentiert das Hintergrundbild des Schnittstellens, und LayeredPanel ist das hierarchische Panel der Schnittstelle, das die Einstellung des Hintergrundbildes erleichtert. JP, JL ist die Komponente, die das Hintergrundbild festlegt. Das Design lautet wie folgt:
Paketstar; Import Java.awt.BorderLayout; Import Java.awt.Color; Import Java.awt.font; Import Java.awt.event.ActionEvent; Import Java.awt.event.ActionListener; javax.swing.jlabel; import javax.swing.jlayeredPane; import Javax.swing.jpanel; Public Class Starbframe erweitert JFrame { / ***Planetary Simulation Startup -Panel* / privat statische endgültige lange Serialversionuid = 1L; Star Center = neuer Stern (300.200); // Definieren Sie die Center Planet Stars P1 = neue Sterne (300+230.200+130, Mitte); // Der Planet, der die Mittelsterne P2 = neue Sterne umgibt (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"); ImageCon Image = New ImageIcon ("timg.jpg"); // Hintergrundbild, verwenden Sie den relativen Pfad, um JlayeredPane LayeredPane zu definieren. // Definieren Sie ein hierarchisches Panel zum Platzieren von Hintergrundbildern JPanel JP; Jlabel JL; public starframe () {// Position für P1 und Größe P1.SetBounds (40,40,600,400) festlegen; // p2.setBounds (40,40.600.400); // Definieren Sie das Hintergrundbild, platzieren Sie das Hintergrundbild in jlabel, platzieren Sie das JLabel in jpanel LayeredPane = new JlayeredPane (); JP = new Jpanel (); JP.SetBounds (0,0, Image.geticonwidth (), Image.geticonHeight ()); jl = new JLabel (Bild); jp.add (jl); // JP auf die untere Schicht legen. LayeredPane.add (JP, JlayeredPane.Default_Layer); // JB in die erste Etage leiten. // LayeredPane.add (p2, jlayeredPane.modal_layer); LayeredPane.add (getPanel (), jlayeredPane.Modal_Layer); LayeredPane.Add (getLabel (), jlayeredPane.modal_layer); LayeredPane.Add (getLabel (), jlayeredPane.modal_layer); // Verwandte Aktionen für JB1, JB2, JB3 bzw. JB4, jb1.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {// todo auto-generierter Methode Stub p1.start (); jb2.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {// Todo automatisch generierter Methode Stub p1.pause ();}}); JB3.AddActionListener (new ActionListener () {public void actionPerformed (actionEvent e) {// Todo Auto-generierter Methode Stub p1.accelerate ();}}); JB4.AddActionListener (new ActionListener () {public void actionPerformed (actionEvent e) {// Todo automatisch generierter Methode Stub p1.decelerate ();}}); this.setLayeredPane (LayeredPane); this.settitle ("stern"); this.setBounds (100.100.1000.600); this.setDefaultCloseOperation (jframe.exit_on_close); this.setvisible (true); } private jpanel getPanel () {// Gibt die vier Buttons defined JPanel JP = new Jpanel () zurück; JP.ADD (JB1); JP.ADD (JB2); JP.ADD (JB3); JP.ADD (JB4); JP.SetBounds (750.450.200,70); Rückkehr JP; } private jpanel getLabel () {// Die Textbeschreibung gibt JLabel jl = new JLabel ("Planetary Simulation"); jl.setforenground (color.red); // Setzen Sie die Schriftfarbe jl.setfont (neue Schriftart ("Dialog", 0,20); // Setzen Sie die Schriftart jpanel jp = new jpanel (); JP.ADD (JL, BorderLayout.Center); JP.SetBounds (800,0,150,40); Rückkehr JP; } public static void main (String [] args) {@Suppresswarnings ("unbenutzt") Sternenframe f = neuer Sternenframe (); }}Laufeffekt:
2. Objekt:
Da Java eine objektorientierte Sprache ist, kann sie natürlich nicht durch Funktionen wie C-Sprache implementiert werden. Wie kann es in der Kurstruktur keine Objekte geben?
Hauptobjekte:
Objektzentrum, d. H. Zentralplanet
Objekt P1, umkreist den Planeten
Objekt PT, dh das Objekt, das für die Steuerung des Threads verantwortlich ist
Objekt f, d. H. Das Programm Startup -Panel
3. Beziehung zwischen Objekten (Interaktion)
Die Beziehung zwischen P1 und Mitte: Die Sternklasse ist die Basisklasse des Planeten, die von JPanel geerbt wird, und der Grundradius und die Koordinaten werden intern definiert. Tatsächlich ist das sofortige Objektzentrum die Mitte des beweglichen Planeten. Die von Star geerbte Sterneklasse repräsentiert einen bewegenden Planeten, was eine weitere Verfeinerung darstellt. Daher repräsentiert das Instanziierungsobjekt P1 einen beweglichen Planeten 1 und bewegt sich um das Zentrum. Gleichzeitig wird das Zentrum als Parameter an P1 übergeben, um die Wechselwirkung zwischen den beiden zu vervollständigen. Dies ist die Beziehung zwischen Objekt P1 und Mitte. Nach dem Instanziieren des Objektzentrums wird ein fester Kreis unter die angegebenen Koordinaten gezogen, und die X- und Y -Koordinaten des Mittelobjekts ändern sich nicht. Auf der Grundlage eines soliden Kreises zeichnet das Objekt P1 die elliptischen Umlaufbahnen der angegebenen Hauptachse und der kleinen Achse gemäß den Koordinaten des Zentrums. Gleichzeitig implementiert es die Thread -Klasse intern, die den Ausführungs -Thread nicht unterbricht. Die gegenseitige Vererbungsbeziehung ermöglicht es Center und P1, Diagramme zu zeichnen, ohne sich gegenseitig zu stören. Es ist erwähnenswert, dass in der Methode PaintComponent () in der STRAS -Klasse die Methode Draw () des Mittelobjekts noch aufgerufen werden muss, da der Thread die Repaint () -Methode zu Beginn aufruft. Wenn die Draw () -Methode des Zentrums nicht implementiert wird, zeigt das Endergebnis den zentralen Planeten nicht.
Die Beziehung zwischen PT und P1: Die PThread -Klasse erbt aus der Thread -Klasse und definiert die Run () -Methode. Durch das Instantieren des Objekts P1 kann die Start () -Methode aufgerufen werden, um den Thread zu starten. Die PThread -Klasse befindet sich in der Startklasse, sodass der Thread durch die Methoden in P1 gesteuert werden kann, dh er kann seine Geschwindigkeit steuern, beschleunigen und verlangsamen und steuern, ob sie ausgeführt wird oder nicht.
Die Beziehung zwischen F und jedem Objekt: Starbrame erbt von JFrame. Tatsächlich fügt das Instanziierungsobjekt F jedes Objekt in die Leinwand hinzu, erstellt eine Schnittstelle und steuert die Größe und Position jeder Komponente, was der Schlüssel zum Programm des Programms ist.
4. Objektorientiertes Verständnis:
Alles ist ein Objekt. Einige Schüler fragten mich, was das Objekt sei. Ich antwortete, dass diejenigen mit neuen Objekten und Objekte die Instanziierung von Klassen sind. In diesem Programm können unzählige Planeten erstellt werden, indem die Sternenklasse instanziiert (theoretisch ja). Einige Probleme bei der Umsetzung interner Funktionen sind jedoch schwer zu lösen. Die Hauptsache ist, die Methode PaintComponent () umzuschreiben. Nach dem erneuten Erstellen des Objekts wird die Methode erneut umschreiben, sodass ein unvermeidliches Problem auftritt, was auch ein Bedauern ist, das nicht gelöst werden kann!
For more Java-related content, readers who are interested in this site can view the topics: "Introduction and Advanced Tutorial on Java Object-Oriented Programming", "Tutorial on Java Data Structure and Algorithm", "Summary of Java Operation DOM Node Skills", "Summary of Java File and Directory Operation Skills" and "Summary of Java Cache Operation Skills"
Ich hoffe, dieser Artikel wird für Java -Programme aller hilfreich sein.