บทความนี้อธิบายถึงการจำลองการเคลื่อนไหวของดาวเคราะห์ที่ดำเนินการโดยการเขียนโปรแกรม Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
การเขียนโปรแกรมภาษา Java ที่ฉันรอคอยมานานแล้วก็สิ้นสุดลงเช่นกัน ในอีกไม่กี่เดือนข้างหน้าฉันได้เชี่ยวชาญการใช้งานง่าย ๆ ของ Java เรียนรู้ความรู้พื้นฐานหลักของ Java, การคิดเชิงวัตถุ, การควบคุมพร้อมกันหลายเธรด, การออกแบบอินเทอร์เฟซสวิง, การผลิตภาพเคลื่อนไหว ฯลฯ ในที่สุดฉันวางแผนที่จะสร้างการออกแบบหลักสูตรที่สามารถครอบคลุมความรู้ที่ได้เรียนรู้มากที่สุด ดังนั้นฉันจึงพิจารณาใช้ซอฟต์แวร์ง่าย ๆ เพื่อจำลองการเคลื่อนไหวของดาวเคราะห์ แนวคิดหลักมีดังนี้:
แอนิเมชั่นใช้เพื่อจำลองการเคลื่อนไหวของดาวเคราะห์ มีดาวเคราะห์กลางในแผงหลักและวงโคจรรูปไข่ถูกวาดขึ้นและดาวเคราะห์ที่เคลื่อนที่กำลังเคลื่อนที่ไปรอบ ๆ ดาวเคราะห์กลาง ในเวลาเดียวกันมีสี่ปุ่มตั้งอยู่ที่มุมล่างขวาคือ "เริ่ม", "หยุดชั่วคราว", "เร่ง" และ "ชะลอตัว" ที่สามารถทำให้ดาวเคราะห์เคลื่อนที่หยุดเร่งความเร็วและชะลอตัวตามลำดับ
1. การออกแบบชั้นเรียน:
ดาราสืบทอดมาจาก JPanel ระดับดาวเป็นคลาสพื้นฐานของดาวเคราะห์และดาวเคราะห์ที่เคลื่อนที่ทั้งหมดได้รับการสืบทอดมาจากระดับดาว วิธีการ Draw () ภายในส่วนใหญ่จะวาดวงกลมที่เป็นของแข็งและวัตถุประสงค์คือเพื่อให้แน่ใจว่าดาวเคราะห์กลางจะปรากฏขึ้นเสมอทุกครั้งที่มีการวาด วิธีการ PaintComponent () จะเอาชนะวิธีการวาด JPanel โดยมีวัตถุประสงค์เพื่อให้แน่ใจว่าวัตถุอินสแตนซ์ของคลาสดาวที่สืบทอดมาจากคลาสดาวสามารถวาดดาวเคราะห์ของตัวเองได้ ดังนี้:
Package Star; Import Java.awt.Color; นำเข้า Java.awt.graphics; นำเข้า Javax.swing.jpanel; Star ระดับสาธารณะขยาย JPanel { / *** คลาสพื้นฐานของดาวเคราะห์* / ส่วนตัวคงที่ int x, y; ความกว้าง int, ความสูง; ดาวสาธารณะ () {width = 10; ความสูง = 10; } ดาวสาธารณะ (int x, int y) {this.x = x; this.y = y; ความกว้าง = 10; ความสูง = 10; } โมฆะสาธารณะวาด (กราฟิก g) {g.setColor (color.blue); G.filloval (x, y, ความกว้าง, ความสูง); } Void PaintComponent (กราฟิก G) {super.paintComponent (G); G.filloval (x, y, ความกว้าง, ความสูง); -คลาส Stars สืบทอดมาจากคลาส Star ซึ่งเป็นการปรับแต่งเพิ่มเติมของระดับดาวซึ่งเป็นตัวแทนของดาวเคราะห์ที่เคลื่อนที่ ALFA ในคลาสดาวหมายถึงมุมเริ่มต้นของดาวเคราะห์ที่เคลื่อนที่และความเร็วแสดงถึงความเร็วของการเคลื่อนไหวซึ่งสามารถปรับเปลี่ยนได้ ยาวและสั้นแสดงถึงแกนหลักและแกนรองของวิถีรูปวงรีตามลำดับ ศูนย์กลางแสดงถึงดาวเคราะห์กลางของวัตถุอินสแตนซ์ ฟังก์ชั่น PaintComponent () แทนที่ PaintComponent (), หมายถึงฟังก์ชั่นการวาด () ของคลาสแม่และวาดแทร็กรูปไข่ตามยาวสั้นและยาวและสั้นจะถูกกำหนดโดยวัตถุอินสแตนซ์ที่เรียกตัวสร้าง ฟังก์ชั่นการย้าย () อธิบายถึงสมการการเปลี่ยนแปลงของ X และ Y นั่นคือการเปลี่ยนแปลงรอบวงโคจรรูปไข่และยังระบุวิธีการเปลี่ยนแปลงของ ALFA ฟังก์ชั่นเริ่มต้น () หมายถึงการเริ่มต้นของเธรดฟังก์ชั่นการหยุดชั่วคราว () หมายถึงการหยุดเธรดการเร่งความเร็ว () ฟังก์ชั่นหมายถึงการดำเนินการเร่งความเร็วบนดาวเคราะห์และฟังก์ชั่น Decelerate () บ่งชี้การทำงานของการลดลงของดาวเคราะห์
จุดประสงค์ของคลาส pthread คือการควบคุมเธรดนั่นคือการเคลื่อนไหวเริ่มต้นการเคลื่อนไหวหยุดชั่วคราวเร่งความเร็วและชะลอตัวของดาวเคราะห์ผ่านการสร้างอินสแตนซ์ของคลาส pthread คลาส pthread สืบทอดมาจากคลาสเธรดและรวมอยู่ในคลาสเริ่มต้น ดังนั้นคลาส pthread จึงไม่สามารถกำหนดเป็นคลาสทั่วไป คลาส pthread ให้วิธีการเรียกใช้ () เรียกใช้วิธีการทาสีใหม่ () อย่างต่อเนื่องเพื่อทาสีใหม่ เมธอด setSuspend () ใช้การเปลี่ยนตัวแปรบูลีนเพื่อหยุดชั่วคราวเธรด (เรียกเมธอด NotifyAll ()) เนื่องจากคลาส pthread เป็นคลาสภายในของการเริ่มต้นวัตถุของคลาส pthread จะถูกสร้างขึ้นในคลาสเริ่มต้นและเธรดจะดำเนินการโดยใช้วัตถุนี้
การออกแบบมีดังนี้:
Package Star; Import Java.awt.Color; นำเข้า Java.awt.Graphics; ดาวระดับสาธารณะขยายดาว { / *** ดาวเคราะห์เคลื่อนที่* / ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1L; Double Alfa; ความเร็วสองเท่า ศูนย์ดาว; int ยาว; // darken axis int short; // ดาวดวงสั้นดาวสาธารณะ (int px, int py, ศูนย์ดาว) {super (px, py); this.center = center; long = (px - center.x)*2; สั้น = (py - center.y)*2; this.setOpaque (จริง); // move (); Alfa = 0; ความเร็ว = 0.001; } Void PaintComponent (กราฟิก G) {super.paintComponent (G); center.draw (g); // วาดจุดกึ่งกลาง (); G.SetColor (color.green); G.Drawoval (center.x-long/2, center.y-short/2, ยาว, สั้น, สั้น); } โมฆะสาธารณะย้าย () {x = center.x + (int) (ยาว/2*math.cos (alfa)); y = center.y + (int) (สั้น/2*math.sin (alfa)); // เรียกใช้ Alfa ตามวิถีรูปไข่ += ความเร็ว; // มุมมีการเปลี่ยนแปลงอยู่ตลอดเวลา} คลาส pthread ขยายเธรด {// repaint เธรดคลาสบูลีนส่วนตัว suspend = true; การควบคุมสตริงส่วนตัว = ""; โมฆะสาธารณะเรียกใช้ () {ในขณะที่ (จริง) {ซิงโครไนซ์ (ควบคุม) {ถ้า (ระงับ) {// ย้าย (); ทาสีใหม่ (); }}}} โมฆะสาธารณะ setSsOpend (บูลีน s) {// ตั้งค่าเธรดหยุดเมธอดถ้า (! suspend) {ซิงโครไนซ์ (ควบคุม) {control.notifyall (); }} this.suspend = s; }} สาธารณะ pthread pt = new pthread (); Public Void Start () {Pt.Setsuspend (จริง); Pt.Start (); } โมฆะสาธารณะหยุดชั่วคราว () {pt.setsuspend (เท็จ); } โมฆะสาธารณะเร่งความเร็ว () {// วิธีเร่งความเร็วถ้า (ความเร็ว> 0) {// การเร่งความเร็วมุม 0.0002 ความเร็ว += 0.0002; } else speed = 0.001; } โมฆะสาธารณะ decelerate () {// decelerate วิธีถ้า (ความเร็ว> 0) {ความเร็ว -= 0.0002; // การชะลอตัวในแต่ละมุม 0.0002} // หากความเร็วลดลงถึง 0 คุณจะไม่สามารถชะลอตัวได้ ความเร็วคือ 0. หยุดการเคลื่อนไหวอื่นความเร็ว = 0; -คลาส StarFrame เป็นแผงเริ่มต้นของโปรแกรมนี้ ด้วยการสร้างอินสแตนซ์คลาสนี้จะมีการสร้างอินเทอร์เฟซโปรแกรมหลักและส่วนประกอบของดาวเคราะห์ปุ่มและป้ายกำกับจะถูกเพิ่มเข้าไปในแผงควบคุม เมธอด getPanel () ภายในตั้งปุ่มสองปุ่มและส่งคืน JPanel (เพิ่มสี่ปุ่มลงใน JPanel) วิธี getLabel () ส่งคืน JLabel พร้อมคำอธิบายที่แท้จริง วัตถุศูนย์คือการสร้างอินสแตนซ์ของระดับดาวและ P1 เป็นอินสแตนซ์ของคลาสดาวซึ่งเป็นตัวแทนของดาวเคราะห์กลางและดาวเคราะห์ที่โคจรรอบตามลำดับ JB1, JB2, JB3 และ JB4 เป็นปุ่มควบคุมสำหรับการเริ่มต้นหยุดการเร่งความเร็วและการชะลอตัวของดาวเคราะห์ตามลำดับ ภาพแสดงภาพพื้นหลังอินเตอร์เฟสและ LayeredPanel เป็นแผงลำดับชั้นของอินเตอร์เฟสซึ่งอำนวยความสะดวกในการตั้งค่าภาพพื้นหลัง JP, JL เป็นส่วนประกอบที่ตั้งค่าภาพพื้นหลัง การออกแบบมีดังนี้:
Package Star; นำเข้า Java.awt.BorderLayout; นำเข้า java.awt.Color; นำเข้า java.awt.font; นำเข้า java.awt.event.actionEvent; นำเข้า java.awt.event.actionlistener; นำเข้า Javax.swing.imageicon; javax.swing.jlabel; นำเข้า Javax.swing.jlayeredpane; นำเข้า Javax.swing.jpanel; Starframe ชั้นเรียนสาธารณะขยาย JFrame { / ***แผงการเริ่มต้นการจำลองดาวเคราะห์* / ส่วนตัว Star Center = New Star (300,200); // กำหนดดาวเคราะห์กลางดาว P1 = ดาวดวงใหม่ (300+230,200+130, ศูนย์); // ดาวเคราะห์รอบดาวกลางดาว P2 = ดาวใหม่ (300+230+20,200+130+20, p1); JButton JB1 = New JButton ("Start"); JButton JB2 = new JButton ("หยุดชั่วคราว"); JButton JB3 = New JButton ("เร่งความเร็ว"); JButton JB4 = New JButton ("Decelerate"); Imageicon image = ใหม่ 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 (รูปภาพ); 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); layeredpane.add (getLabel (), jlayeredpane.modal_layer); // ตั้งค่าการกระทำที่เกี่ยวข้องสำหรับ JB1, JB2, JB3 และ JB4 ตามลำดับ, JB1.AddActionListener (ActionListener ใหม่ () {โมฆะสาธารณะ ActionPerformed (ActionEvent E) {// TODO วิธีการที่กำหนดอัตโนมัติ p1.start ();}}); jb2.addactionListener (ใหม่ actionListener () {โมฆะสาธารณะ actionperformed (actionEvent E) {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stub p1.pause ();}}); jb3.addactionListener (ใหม่ actionListener () {โมฆะสาธารณะ actionperformed (ActionEvent E) {// todo วิธีการสร้างอัตโนมัติที่สร้างขึ้นโดยอัตโนมัติ p1.accelerate ();}}); jb4.addactionListener (ใหม่ actionListener () {โมฆะสาธารณะ actionperformed (actionEvent E) {// todo วิธีการสร้างอัตโนมัติที่สร้างขึ้นโดยอัตโนมัติ p1.decelerate ();}}); this.SetLayeredPane (LayeredPane); this.settitle ("Star"); สิ่งนี้ setbounds (100,100,1000,600); this.setDefaultCloseOperation (jframe.exit_on_close); this.setVisible (จริง); } ส่วนตัว JPanel getPanel () {// ส่งคืนสี่ปุ่มที่กำหนด JPanel JP = new JPanel (); JP.Add (JB1); JP.Add (JB2); JP.Add (JB3); JP.Add (JB4); JP.SetBounds (750,450,200,70); กลับ JP; } ส่วนตัว jPanel getLabel () {// ส่งคืนคำอธิบายข้อความ jlabel jl = new jlabel ("การจำลองดาวเคราะห์"); jl.setforeground (color.red); // ตั้งค่าสีตัวอักษร jl.setfont (ตัวอักษรใหม่ ("กล่องโต้ตอบ", 0,20)); // ตั้งค่าตัวอักษร jpanel jp = new JPanel (); JP.Add (JL, BorderLayout.Center); JP.SetBounds (800,0,150,40); กลับ JP; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {@suppresswarnings ("ไม่ได้ใช้") starframe f = new StarFrame (); -เอฟเฟกต์การทำงาน:
2. วัตถุ:
เนื่องจาก Java เป็นภาษาที่มุ่งเน้นวัตถุแน่นอนจึงไม่สามารถนำไปใช้งานได้เช่นเดียวกับภาษา C จะไม่มีวัตถุในโครงสร้างหลักสูตรได้อย่างไร?
วัตถุหลัก:
ศูนย์วัตถุเช่นดาวเคราะห์กลาง
วัตถุ P1 โคจรรอบดาวเคราะห์
วัตถุ PT นั่นคือวัตถุที่รับผิดชอบในการควบคุมเธรด
วัตถุ F, เช่นแผงเริ่มต้นโปรแกรม
3. ความสัมพันธ์ระหว่างวัตถุ (ปฏิสัมพันธ์)
ความสัมพันธ์ระหว่าง P1 และศูนย์กลาง: ระดับดาวเป็นคลาสพื้นฐานของดาวเคราะห์ที่สืบทอดมาจาก JPanel และรัศมีพื้นฐานและพิกัดจะถูกกำหนดภายใน ในความเป็นจริงศูนย์วัตถุอินสแตนซ์เป็นศูนย์กลางของดาวเคราะห์ที่กำลังเคลื่อนที่ คลาสดาวที่สืบทอดมาจากดาวเป็นดาวเคราะห์ที่กำลังเคลื่อนที่ซึ่งเป็นการปรับแต่งเพิ่มเติม ดังนั้นวัตถุอินสแตนซ์ P1 แสดงถึงดาวเคราะห์ที่กำลังเคลื่อนที่ 1 และเคลื่อนที่ไปรอบ ๆ กึ่งกลาง ในเวลาเดียวกันศูนย์จะถูกส่งผ่านเป็นพารามิเตอร์ไปยัง P1 เพื่อให้การโต้ตอบระหว่างทั้งสองเสร็จสมบูรณ์ นี่คือความสัมพันธ์ระหว่างวัตถุ P1 และศูนย์ หลังจากอินสแตนซ์ของศูนย์วัตถุวงกลมของแข็งจะถูกวาดภายใต้พิกัดที่ระบุและพิกัด X และ Y ของวัตถุกลางจะไม่เปลี่ยนแปลง บนพื้นฐานของการวาดวงกลมที่เป็นของแข็งวัตถุ P1 ดึงวงโคจรวงรีของแกนหลักที่ระบุและแกนรองตามพิกัดของศูนย์ ในขณะเดียวกันก็ใช้คลาสเธรดภายในซึ่งไม่ขัดจังหวะเธรดการดำเนินการ ความสัมพันธ์ระหว่างการสืบทอดซึ่งกันและกันช่วยให้ศูนย์และ P1 สามารถวาดกราฟได้โดยไม่รบกวนซึ่งกันและกัน เป็นเรื่องที่ควรค่าแก่การกล่าวถึงว่าในวิธีการ PaintComponent () ในคลาส Stras วิธีการ Draw () ของวัตถุกลางยังคงต้องเรียกเพราะเธรดจะเรียกวิธีการ repaint () ที่จุดเริ่มต้น หากวิธีการจับสลากของศูนย์ () ไม่ได้ใช้งานผลลัพธ์สุดท้ายจะไม่แสดงดาวเคราะห์กลาง
ความสัมพันธ์ระหว่าง PT และ P1: คลาส pthread สืบทอดมาจากคลาสเธรดและกำหนดวิธีการเรียกใช้ () โดยการสร้างอินสแตนซ์วัตถุ P1 สามารถเรียกใช้วิธีการเริ่มต้น () เพื่อเริ่มเธรด คลาส pthread อยู่ในคลาสเริ่มต้นดังนั้นเธรดสามารถควบคุมได้ผ่านวิธีการใน P1 นั่นคือมันสามารถควบคุมความเร็วเร่งความเร็วและชะลอตัวและควบคุมว่ามันทำงานหรือไม่
ความสัมพันธ์ระหว่าง F และแต่ละวัตถุ: StarFrame สืบทอดมาจาก JFrame ในความเป็นจริงวัตถุอินสแตนซ์ F เพิ่มแต่ละวัตถุลงในผืนผ้าใบสร้างอินเทอร์เฟซและควบคุมขนาดและตำแหน่งของแต่ละองค์ประกอบซึ่งเป็นกุญแจสำคัญในการดำเนินการของโปรแกรม
4. ความเข้าใจเชิงวัตถุ:
ทุกอย่างเป็นวัตถุ นักเรียนบางคนถามฉันว่าวัตถุคืออะไร ฉันตอบว่าผู้ที่มีใหม่เป็นวัตถุและวัตถุเป็นอินสแตนซ์ของคลาส ในโปรแกรมนี้ดาวเคราะห์นับไม่ถ้วนสามารถสร้างขึ้นได้โดยการสร้างอินสแตนซ์คลาสดาว (ในทางทฤษฎีใช่) อย่างไรก็ตามปัญหาบางอย่างในการใช้งานฟังก์ชั่นภายในนั้นยากที่จะแก้ไข สิ่งสำคัญคือการเขียนวิธี PaintComponent () ใหม่ หลังจากสร้างวัตถุอีกครั้งวิธีการจะเขียนอีกครั้งดังนั้นปัญหาที่หลีกเลี่ยงไม่ได้จะเกิดขึ้นซึ่งก็เป็นความเสียใจที่ไม่สามารถแก้ไขได้!
สำหรับเนื้อหาที่เกี่ยวข้องกับ Java ผู้อ่านที่สนใจในเว็บไซต์นี้สามารถดูหัวข้อ: "บทนำและการสอนขั้นสูงเกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ Java", "การสอนเกี่ยวกับโครงสร้างข้อมูล Java และอัลกอริทึม" สรุปการดำเนินงานของ Java
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน