Cet article décrit la simulation du mouvement planétaire implémenté par la programmation Java. Partagez-le pour votre référence, comme suit:
La programmation en langue Java que j'attendais depuis longtemps a également pris fin. En quelques mois, j'ai essentiellement maîtrisé l'utilisation simple de Java, j'ai appris la principale connaissance de base de Java, une pensée orientée objet, un contrôle de concurrence multithread, une conception d'interface swing, une production d'animation, etc. Par conséquent, j'ai envisagé de mettre en œuvre un logiciel simple pour simuler le mouvement planétaire. Les principales idées sont les suivantes:
L'animation est utilisée pour simuler le mouvement planétaire. Il y a une planète centrale dans le panneau principal, et une orbite elliptique est dessinée, et une planète en mouvement se déplace dans la planète centrale. Dans le même temps, il y a quatre boutons dans le coin inférieur droit, à savoir "démarrer", "pause", "accélérer" et "décélérer" qui peuvent faire bouger, s'accélérer, accélérer et décélérer respectivement.
1. Conception de classe:
Star hérite de Jpanel. La classe Star est la classe de base des planètes, et toutes les planètes en mouvement sont héritées de la classe Star. La méthode interne Draw () dessine principalement un cercle solide, et le but est de s'assurer que la planète centrale s'affiche toujours à chaque fois qu'elle est dessinée. La méthode PaintComponent () remplace la méthode de dessin JPanel, visant à garantir que les objets d'instance de la classe des étoiles hérités de la classe Star peuvent dessiner leurs propres planètes. comme suit:
Package Star; import java.awt.color; import java.awt.graphics; import javax.swing.jpanel; la classe publique Star étend jpanel {/ ** * classe planétaire de base * / private static final SerialVersionUID = 1l; int x, y; Largeur int, hauteur; public star () {width = 10; hauteur = 10; } public Star (int x, int y) {this.x = x; this.y = y; largeur = 10; hauteur = 10; } public void draw (graphics g) {g.setColor (color.blue); G.Filloval (x, y, largeur, hauteur); } Protected void PaintComponent (Graphics G) {super.paintComponent (G); G.Filloval (x, y, largeur, hauteur); }}La classe Stars hérite de la classe Star, qui est un autre raffinement de la classe Star, représentant des planètes en mouvement. La classe Alfa in the Stars représente l'angle de départ de la planète en mouvement, et la vitesse représente la vitesse du mouvement, qui peut être modifiée. Les longs et les courts représentent l'axe majeur et l'axe mineur de la trajectoire elliptique respectivement. Le centre représente la planète centrale de son objet instancié. La fonction PaintComponent () remplace PaintComponent (), se réfère en interne à la fonction Draw () de la classe parent et tire la piste elliptique en fonction de long, court, et long et court est déterminé par l'objet d'instanciation appelant le constructeur. La fonction Move () décrit l'équation de changement de x et y, c'est-à-dire des changements autour de l'orbite elliptique, et spécifie également la façon dont Alfa change. La fonction start () indique le début du thread, la fonction Pause () indique la pause du thread, la fonction accélération () indique l'opération d'accélération sur la planète et la fonction declérérate () indique l'opération sur la décélération de la planète.
Le but de la classe Pthread est de contrôler les threads, c'est-à-dire le mouvement initial, le mouvement de pause, l'accélération et la décélération de la planète par l'instanciation de la classe Pthread. La classe Pthread hérite de la classe Thread et est incluse dans la classe START. Par conséquent, la classe Pthread ne peut pas être définie comme une classe commune. La classe Pthread fournit une méthode run (), appelle constamment la méthode Repainte () pour repeindre l'image. La méthode setSusPend () utilise la modification de la variable booléenne pour suspendre le thread (appelez la méthode notifyall ()). Étant donné que la classe PTHREAD est une classe interne de départs, un objet de la classe PTHREAD sera généré dans la classe START et le thread sera utilisé à l'aide de cet objet.
La conception est la suivante:
Package Star; import java.awt.color; import java.awt.graphics; les stars de classe publique étendent la star {/ ** * planète en mouvement * / private statique long SerialVersionUID = 1l; double alfa; double vitesse; Star Center; int long; // Axe d'obscurcissement int court; // étoiles publiques de l'axe court (int px, int py, star centre) {super (px, py); this.center = centre; Long = (px - Centre.x) * 2; Short = (py - Centre.y) * 2; this.setOpaque (true); // move (); alfa = 0; vitesse = 0,001; } Protected void PaintComponent (Graphics G) {super.paintComponent (g); Centre.Draw (g); // dessiner le point de point central (); g.setColor (Color.Green); G.Drawoval (Centre.x-Long / 2, Centre.y-short / 2, long, court); } public void move () {x = Centre.x + (int) (long / 2 * math.cos (alfa)); y = Centre.y + (int) (court / 2 * math.sin (alfa)); // Exécutez Alfa le long de la trajectoire elliptique + = vitesse; // L'angle change constamment} class Pthread étend Thread {// Repaindre le thread class private boolean suspension = true; Control de chaîne privée = ""; public void run () {while (true) {synchronisé (contrôle) {if (suspendre) {// move (); repeindre(); }}}} public void setsSopend (boolean s) {// set thread pause method if (! suspendre) {synchronized (contrôle) {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 () {// accélérer la méthode if (vitesse> 0) {// Accélération d'angle 0,0002 vitesse + = 0,0002; } else Speed = 0,001; } public void decèlerate () {// Décélérer la méthode if (Speed> 0) {Speed - = 0.0002; // Décélération à chaque angle 0,0002} // Si la vitesse est décélérée à 0, vous ne pouvez pas continuer à décélérer. La vitesse est 0. Arrêt du mouvement Else Speed = 0; }}La classe StarFrame est le panneau de démarrage de ce programme. En instanciant cette classe, l'interface de programme principale est générée et des composants planétaires, des boutons et des étiquettes sont ajoutés au panneau. La méthode interne getPanel () définit les deux boutons et renvoie un jpanel (ajoute quatre boutons dans le jpanel). La méthode getLabel () renvoie un JLabel avec une description littérale. L'objet central est une instanciation de la classe Star, et P1 est une instanciation de la classe des étoiles, représentant respectivement la planète centrale et la planète en orbite. JB1, JB2, JB3 et JB4 sont les boutons de contrôle pour démarrer, pause, accélérer et décélération respectivement de la planète. L'image représente l'image d'arrière-plan de l'interface, et LacheeredPanel est le panneau hiérarchique de l'interface, qui facilite le réglage de l'image d'arrière-plan. JP, JL est le composant qui définit l'image d'arrière-plan. La conception est la suivante:
Star de package; 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.jfrrame; import; javax.swing.jLabel; import javax.swing.jlayeredpane; import javax.swing.jpanel; classe publique StarFrame étend JFrame {/ ** * Panneup de startup de simulation planétaire * / private static final SerialversionUid = 1l; Star Center = New Star (300 200); // Définir les étoiles de la planète centrale P1 = nouvelles étoiles (300 + 230 200 + 130, centre); // la planète entourant les étoiles centrales p2 = nouvelles étoiles (300 + 230 + 20200 + 130 + 20, p1); Jbutton jb1 = new JButton ("start"); Jbutton jb2 = new JButton ("pause"); Jbutton jb3 = new Jbutton ("accélérer"); JBUTTON JB4 = nouveau JBUTTON ("Décélérer"); ImageIcon Image = new ImageIcon ("timg.jpg"); // image d'arrière-plan, utilisez le chemin relatif pour définir JLayeredPane LayeredPane; // définir un panneau hiérarchique pour placer des images d'arrière-plan jpanel jp; JLabel JL; public starframe () {// Définir la position pour P1 et taille p1.setBounds (40,40,600,400); // P2.SetBounds (40,40,600,400); // Définissez l'image d'arrière-plan, placez l'image d'arrière-plan dans JLabel, placez le jlabel dans jpanel coucheeredPane = new JLayeredPane (); jp = new JPanel (); jp.setBounds (0,0, image.getIConWidth (), image.getIConHeight ()); jl = new JLabel (image); jp.add (jl); // Mettez JP sur la couche inférieure. LayeredPane.Add (JP, jlakeeredpane.default_layer); // Mette JB sur le premier étage LayeredPane.Add (P1, jLayeredPane.Modal_layer); // coucheeredPane.add (p2, jLayeredPane.modal_layer); coucheeredpane.add (getPanel (), jLayeredPane.modal_layer); coucheeredpane.add (getLabel (), jLayeredPane.modal_layer); coucheeredpane.add (getLabel (), jLayeredPane.modal_layer); // Définit des actions connexes pour JB1, JB2, JB3 et JB4, respectivement, JB1.AddactionListener (new ActionListener () {public void ActionPerformed (ActionEvent E) {// TODO Méthode générée automatiquement Stub P1.Start ();}}); JB2.AddActionListener (new ActionListener () {public void ActionPerformed (ActionEvent e) {// TODO Méthode générée automatiquement Stub p1.pause ();}}); JB3.AddActionListener (new ActionListener () {public void ActionPerformed (ActionEvent e) {// TODO Méthode générée automatiquement Stub p1.accelerate ();}}); JB4.AddActionListener (new ActionListener () {public void ActionPerformed (ActionEvent e) {// TODO Méthode générée automatiquement Stub p1.decerate ();}}); this.setLayeredPane (LayeredPane); this.setTitle ("star"); this.setbounds (100 100,1000 600); this.setDefaultCloseOperation (jframe.exit_on_close); this.setVisible (true); } private jpanel getPanel () {// renvoie les quatre boutons définis jpanel jp = new JPanel (); JP.Add (JB1); JP.Add (JB2); JP.Add (JB3); JP.Add (JB4); JP.SetBounds (750 450,200,70); retourner jp; } private jpanel getLabel () {// renvoie le texte Description jLabel jl = new JLabel ("Simulation planétaire"); jl.setForeground (Color.Red); // Définissez la Font Color jl.setfont (Nouvelle Font ("Dialog", 0,20)); // Définit la police jpanel jp = new JPanel (); JP.Add (JL, BorderLayout.Center); JP.SetBounds (800,0,150,40); retourner jp; } public static void main (String [] args) {@SuppressWarnings ("inutilisé") StarFrame f = new StarFrame (); }}Effet de course:
2. Objet:
Parce que Java est une langue orientée objet, bien sûr, il ne peut pas être implémenté par des fonctions comme la langue C. Comment peut-il y avoir des objets dans la structure du cours?
Objets principaux:
Centre d'objets, c'est-à-dire la planète centrale
Objet P1, en orbite autour de la planète
Objet PT, c'est-à-dire l'objet responsable du contrôle du thread
Objet F, c'est-à-dire le panneau de démarrage du programme
3. Relation entre les objets (interaction)
La relation entre P1 et Centre: la classe Star est la classe de base de la planète, héritée de JPanel, et le rayon et les coordonnées de base sont définis en interne. En fait, le centre d'objets instanciés est le centre de la planète en mouvement. La classe Stars héritée de Star représente une planète en mouvement, qui est un autre raffinement. Par conséquent, l'objet d'instanciation P1 représente une planète en mouvement 1 et se déplace autour du centre. Dans le même temps, le centre est passé sous forme de paramètre à P1 pour terminer l'interaction entre les deux. Ceci est la relation entre l'objet P1 et le centre. Après avoir instancié le centre de l'objet, un cercle solide sera dessiné sous les coordonnées spécifiées, et les coordonnées X et Y de l'objet central ne changeront pas. Sur la base du dessin d'un cercle solide, l'objet P1 dessine les orbites elliptiques de l'axe majeur spécifié et de l'axe mineur en fonction des coordonnées du centre. En même temps, il implémente la classe de threads en interne, qui n'interrompt pas le thread d'exécution. La relation d'héritage mutuel permet au centre et à P1 de dessiner des graphiques sans interférer les uns avec les autres. Il convient de mentionner que dans la méthode PaintComponent () dans la classe STRAS, la méthode Draw () de l'objet central doit encore être appelé, car le thread appellera la méthode Repainte () au début. Si la méthode Draw () du centre n'est pas mise en œuvre, le résultat final ne montrera pas la planète centrale.
La relation entre PT et P1: la classe PTHREAD hérite de la classe de thread et définit la méthode run (). En instanciant l'objet P1, la méthode start () peut être appelée pour démarrer le thread. La classe Pthread est à l'intérieur de la classe START, de sorte que le thread peut être contrôlé via les méthodes de P1, c'est-à-dire qu'elle peut contrôler sa vitesse, accélérer et décélérer et contrôler s'il fonctionne ou non.
La relation entre F et chaque objet: StarFrame hérite de JFrame. En fait, l'objet d'instanciation F ajoute chaque objet dans la toile, crée une interface et contrôle la taille et la position de chaque composant, qui est la clé de l'opération du programme.
4. Compréhension orientée objet:
Tout est un objet. Certains étudiants m'ont demandé quel était l'objet. J'ai répondu que ceux avec de nouveaux objets sont des objets et que les objets sont l'instanciation des classes. Dans ce programme, d'innombrables planètes peuvent être créées en instanciant la classe Stars (théoriquement, oui). Cependant, certains problèmes dans la mise en œuvre des fonctions internes sont difficiles à résoudre. L'essentiel est de réécrire la méthode PaintComponent (). Après avoir à nouveau créé l'objet, la méthode sera à nouveau réécrite, donc un problème inévitable se produira, ce qui est également un regret qui ne peut pas être résolu!
Pour plus de contenu lié à Java, les lecteurs qui sont intéressés par ce site peuvent afficher les sujets: "Introduction et tutoriel avancé sur la programmation Java Oriented Oriented", "Tutorial sur la structure de données Java et l'algorithme", "Résumé des compétences de l'opération Java Dom Dom", "Résumé des compétences de l'opération Java et de l'opération de répertoire" et "Résumé de Java Cache Skills"
J'espère que cet article sera utile à la programmation Java de tous.