ฉันสร้างนาฬิกาโลกโดยใช้ Java Swing ตัวนาฬิกาไม่ได้ซับซ้อนมากนัก เหตุผลที่ฉันทำมินิโปรเจ็กต์นี้คือเพื่อดูว่าฉันสามารถปรับแต่งโซนเวลาได้หรือไม่
นี่คือ GUI พร้อมเขตเวลาเริ่มต้น
นี่คือ JDialog
ที่แสดงโซนเวลาต่างๆ ทั่วโลก
คุณสามารถเลือกโซนเวลาได้มากเท่าที่คุณต้องการ แม้ว่าฉันขอแนะนำให้ 10 โซนเวลาเป็นขีดจำกัดในทางปฏิบัติสำหรับการแสดงผลปัจจุบันส่วนใหญ่
JDialog
ช่วยให้คุณย้ายโซนเวลาจากรายการหลักไปยังรายการที่แสดง และจากรายการที่แสดงไปยังรายการหลัก คุณสามารถล้างเขตเวลาที่แสดงทั้งหมดได้หากต้องการเริ่มต้นใหม่ คุณต้องเลือกอย่างน้อยหนึ่งเขตเวลาที่จะแสดง
รายการหลักยังคงอยู่ในลำดับตัวอักษร รายการที่แสดงจะแสดงโซนเวลาตามลำดับที่คุณเลือก การกดปุ่ม Ctrl
ค้างไว้ขณะคลิกซ้ายของเมาส์จะทำให้คุณสามารถเลือกโซนเวลาต่างๆ เพื่อเพิ่มหรือลบออกจากรายการได้
รหัสนี้ไม่ได้บันทึกโซนเวลาที่คุณเลือกลงในไฟล์คุณสมบัติ นี่คือสิ่งที่สามารถเพิ่มได้หากคุณต้องการใช้นาฬิกาโลกนี้เป็นไฟล์ JAR ที่ปฏิบัติการได้
Oracle มีบทช่วยสอนที่เป็นประโยชน์ การสร้าง GUI ด้วย Swing ข้ามการเรียนรู้แบบ Swing ด้วยส่วน NetBeans IDE
เมื่อฉันสร้างแอปพลิเคชัน Swing ฉันจะใช้รูปแบบ model-view-controller (MVC) รูปแบบนี้ช่วยให้ฉันแยกข้อกังวลของฉันออกและมุ่งเน้นไปที่แอปพลิเคชัน Swing ทีละส่วนได้ ชื่อรูปแบบบ่งบอกว่าคุณสร้างโมเดลก่อน จากนั้นจึงสร้างมุมมอง และสุดท้ายคือคอนโทรลเลอร์ นี่เป็นกระบวนการวนซ้ำ ดังนั้นการเปลี่ยนแปลงในมุมมองหรือตัวควบคุมอาจทำให้เกิดการเปลี่ยนแปลงในโมเดลได้
สำหรับแอปพลิเคชัน Swing รูปแบบ MVC หมายถึง:
มุมมองอ่านข้อมูลจากแบบจำลอง
มุมมองไม่อัปเดตโมเดล
คอนโทรลเลอร์จะอัปเดตโมเดลและทาสีใหม่ / ตรวจสอบมุมมองอีกครั้ง
โดยปกติจะไม่มีผู้ควบคุมเพียงคนเดียวที่จะ "ควบคุมพวกเขาทั้งหมด" แต่ละ Action
หรือ ActionListener
ทำหน้าที่อย่างอิสระและอัพเดตส่วนของโมเดลและมุมมอง
ฉันสร้างคลาสโมเดลหนึ่งคลาส นั่นคือคลาส WorldClockModel
คลาสนี้เก็บวันที่และเวลาปัจจุบัน ZonedDateTime
, java.util.List
ของโซนเวลาทั้งหมด และ java.util.List
ของโซนเวลาที่จะแสดง ฉันเลือก ZonedDateTime
เพื่อที่ฉันจะต้องจัดเก็บเวลาปัจจุบันเพียงครั้งเดียว ฉันสามารถส่ง ZoneId
ไปยัง ZonedDateTime
เพื่อรับเวลาปัจจุบันในเขตเวลาใดก็ได้
List
โซนเวลาทั้งหมดมาจากเมธอด ZoneId
getAvailableZoneIds
ฉันกรองเขตเวลาที่ไม่เกี่ยวข้องกับเมืองออก
ฉันสร้างคลาสมุมมองสองคลาส ได้แก่ คลาส WorldClockGUI
และคลาส DisplayPanel
คลาส WorldClockGUI
สร้าง JFrame
และ JPanel
หลัก JPanel
หลักประกอบด้วยอินสแตนซ์ DisplayPanel
หนึ่งอินสแตนซ์สำหรับแต่ละโซนเวลาที่จะแสดง
JFrame
มีค่าเริ่มต้น BorderLayout
ดังนั้นฉันจึงวาง JPanel
หลักไว้ตรงกลางของ BorderLayout
JPanel
หลักใช้ GridLayout
เพื่อวางอินสแตนซ์ DisplayPanel
ไว้ในคอลัมน์สองคอลัมน์ที่มีระยะห่างเท่ากัน
JDialog
แสดงรายการโซนเวลาทั้งหมด รายการโซนเวลาที่แสดง และควบคุม JButtons
เพื่อย้ายโซนเวลาจากรายการหนึ่งไปยังอีกรายการหนึ่ง ฉันใช้ DefaultListModels
สองรายการ หนึ่งรายการสำหรับแต่ละรายการ
คลาส TimezoneDialogListener
คัดลอกรายการที่แสดงจากจอแสดงผล DefaultListModel
กลับไปยังคลาสโมเดลแอปพลิเคชันและอัปเดตมุมมอง
Swing Timer
จะอัพเดตเวลาปัจจุบันทุกๆ 20 วินาที ซึ่งแม่นยำเพียงพอสำหรับนาฬิกาที่แสดงชั่วโมงและนาที
JButtons
ที่เหลือบน JDialog
จะทริกเกอร์ ActionListeners
ที่ไม่ระบุชื่อให้ทำงานของตน ผู้ฟังมีขนาดเล็ก ดังนั้นจึงเหมาะสมที่จะจัดชั้นเรียนที่ไม่เปิดเผยตัวตนให้กับพวกเขา