Swing และ AWT ต่างกันอย่างไร


222

ใครช่วยอธิบายหน่อยได้ไหมว่า Swing กับ AWT ต่างกันอย่างไร

มีกรณีใดบ้างที่ AWT มีประโยชน์ / แนะนำให้ใช้มากกว่าการสวิงหรือในทางกลับกัน?


คำตอบ:


235

AWT เป็นอินเทอร์เฟซ Java สำหรับรหัส GUI ของระบบดั้งเดิมที่มีอยู่ในระบบปฏิบัติการของคุณ มันจะไม่ทำงานเหมือนกันในทุกระบบแม้ว่ามันจะพยายาม

Swing เป็นจาวา GUI บริสุทธิ์ที่มากกว่าหรือน้อยกว่า มันใช้ AWT เพื่อสร้างหน้าต่างระบบปฏิบัติการจากนั้นวาดรูปภาพของปุ่ม, ป้าย, ข้อความ, ช่องทำเครื่องหมาย, ฯลฯ ลงในหน้าต่างนั้นและตอบสนองต่อการคลิกเมาส์รายการคีย์ ฯลฯ ทั้งหมดเพื่อตัดสินใจว่าจะทำอย่างไร แทนที่จะปล่อยให้ระบบปฏิบัติการจัดการกับมัน ดังนั้น Swing จึงเป็นอุปกรณ์พกพาได้ 100% และเหมือนกันในทุกแพลตฟอร์ม (แม้ว่ามันจะเป็นสกินเนลและมี "รูปลักษณ์และความรู้สึกที่เสียบได้" ซึ่งสามารถทำให้มันดูมากกว่าหรือน้อยกว่า

สิ่งเหล่านี้เป็นวิธีที่แตกต่างกันอย่างมากสำหรับชุดเครื่องมือ GUI และมีผลที่ตามมามากมาย คำตอบสำหรับคำถามของคุณจะพยายามสำรวจทั้งหมด :) นี่คือคู่:

AWT เป็นอินเทอร์เฟซข้ามแพลตฟอร์มดังนั้นแม้ว่าจะใช้ระบบปฏิบัติการพื้นฐานหรือชุดเครื่องมือ GUI พื้นฐานสำหรับการทำงาน แต่ก็ไม่ได้ให้การเข้าถึงทุกสิ่งที่ชุดเครื่องมือเหล่านั้นสามารถทำได้ วิดเจ็ต AWT ขั้นสูงหรือใหม่กว่าที่อาจมีอยู่บนแพลตฟอร์มหนึ่งอาจไม่ได้รับการสนับสนุนจากอีกแพลตฟอร์มหนึ่ง คุณสมบัติของวิดเจ็ตที่ไม่เหมือนกันในทุกแพลตฟอร์มอาจไม่ได้รับการสนับสนุนหรือแย่กว่านั้นอาจทำงานได้แตกต่างกันไปในแต่ละแพลตฟอร์ม ผู้คนเคยลงทุนความพยายามมากมายเพื่อให้แอปพลิเคชัน AWT ทำงานได้อย่างต่อเนื่องในทุกแพลตฟอร์ม - ตัวอย่างเช่นพวกเขาอาจพยายามโทรออกเป็นโค้ดเนทีฟจาก Java

เนื่องจาก AWT ใช้วิดเจ็ต GUI ดั้งเดิมระบบปฏิบัติการของคุณจึงรู้และจัดการวางไว้ตรงหน้ากันขณะที่วิดเจ็ต Swing เป็นพิกเซลที่ไม่มีความหมายภายในหน้าต่างจากมุมมองของระบบปฏิบัติการของคุณ Swing จัดการการจัดวางและวางวิดเจ็ตของคุณเอง การผสม AWT กับ Swing นั้นไม่ได้รับการสนับสนุนอย่างสูงและสามารถนำไปสู่ผลลัพธ์ที่ไร้สาระเช่นปุ่มดั้งเดิมที่ปิดบังทุกอย่างในกล่องโต้ตอบที่พวกเขาอยู่เพราะทุกอย่างถูกสร้างขึ้นด้วย Swing

เนื่องจาก Swing พยายามที่จะทำทุกสิ่งที่เป็นไปได้ใน Java นอกเหนือจากรูทีนกราฟิคดิบๆที่ได้รับจากหน้าต่าง GUI ดั้งเดิมมันเคยถูกลงโทษด้านประสิทธิภาพค่อนข้างมากเมื่อเทียบกับ AWT สิ่งนี้ทำให้ Swing แกว่งไปแกว่งมาช้า อย่างไรก็ตามสิ่งนี้หดตัวลงอย่างมากในช่วงหลายปีที่ผ่านมาเนื่องจาก JVM ที่ได้รับการปรับปรุงให้ดีขึ้นเครื่องจักรที่เร็วขึ้นและการเพิ่มประสิทธิภาพของ (ฉันคิดว่า) การทำงานภายในสวิง วันนี้แอปพลิเคชัน Swing สามารถรันเร็วพอที่จะให้บริการหรือแม้กระทั่งมีกำลังใจและแทบจะแยกไม่ออกจากแอปพลิเคชันที่ใช้วิดเจ็ตดั้งเดิม บางคนจะบอกว่าใช้เวลานานเกินไปกว่าจะถึงจุดนี้ แต่ส่วนใหญ่จะบอกว่าคุ้มค่า

ท้ายที่สุดคุณอาจต้องการตรวจสอบ SWT (ชุดเครื่องมือ GUI ที่ใช้สำหรับ Eclipse และทางเลือกอื่นสำหรับทั้ง AWT และ Swing) ซึ่งค่อนข้างเป็นการย้อนกลับไปสู่แนวคิด AWT ในการเข้าถึงวิดเจ็ตเนทีฟผ่าน Java


อืม ... หลังจากที่ได้ทำ Swing ที่ค่อนข้างกว้างขวางในหลาย ๆ แพลตฟอร์มฉันสามารถบอกคุณได้ว่ามันไม่เหมือนกันในทุกแพลตฟอร์ม ที่คล้ายกัน? แน่ใจ เหมือนกัน? ไม่มีทาง.
cletus

1
ปัญหาเฮฟวี่เวท / น้ำหนักเบาจะหายไปเมื่อมีการอัพเดต Java 6 12 (ดูjava.dzone.com/news/a-farewell-heavyweightlightwei )
Dan Dyer

ว้าว. ฉันไม่สามารถเชื่อได้ว่าพวกเขาสามารถแก้ไขได้และฉันก็ไม่สามารถเชื่อได้ว่าการผสมส่วนประกอบที่มีน้ำหนักเบาและหนาเป็นที่น่าพอใจ แต่มันเหลือเชื่อที่พวกเขาสามารถแก้ไขได้
skiphoppy

แค่ลืมทั้งสองอย่าง ลองดูที่ WPF :)
Alper Ozcetin

3
นี่คือบทความ Java อย่างเป็นทางการที่ยืนยันว่าการผสมได้รับการแก้ไข: oracle.com/technetwork/articles/java/ …
193130

35

ความแตกต่างที่ฐานที่ทุกคนกล่าวถึงเป็นที่หนึ่งคือมีน้ำหนักมากและอื่น ๆ คือมีน้ำหนักเบา ผมขออธิบายโดยทั่วไปสิ่งที่ระยะน้ำหนักหนักหมายถึงก็คือว่าเมื่อคุณกำลังใช้ส่วนประกอบ AWT ที่รหัสพื้นเมืองที่ใช้สำหรับการรับองค์ประกอบมุมมองถูกสร้างขึ้นโดยระบบปฏิบัติการ , thats ทำไมมันรูปลักษณ์และความรู้สึกเปลี่ยนแปลงจาก OS ระบบปฏิบัติการ ในฐานะที่เป็นในส่วนแกว่งความรับผิดชอบของJVM ในการสร้างมุมมองสำหรับส่วนประกอบ คำสั่งที่ฉันเห็นก็คือการแกว่งที่เป็น MVC ตามและ awt ไม่ได้


14
จริง ๆ แล้ว Swing ใช้วิธี Model-Delegate ซึ่งได้มาจากวิธี MVC ซึ่งในมุมมองและคอนโทรลเลอร์จะรวมกันสำหรับโครงสร้าง Delegate
Purushottam

15

สวิง VS AWT โดยทั่วไป AWT มาก่อนและเป็นชุดของส่วนประกอบ UI รุ่นหนา (หมายถึงพวกเขาเป็น wrappers สำหรับวัตถุระบบปฏิบัติการ) ในขณะที่ Swing สร้างขึ้นบน AWT พร้อมชุดส่วนประกอบที่มีน้ำหนักเบายิ่งขึ้น

งาน Java UI ที่ร้ายแรงใด ๆ ที่ทำใน Swing ไม่ใช่ AWT ซึ่งใช้สำหรับแอปเพล็ตเป็นหลัก


1
มีกรณีใดบ้างที่ awt มีประโยชน์มากกว่า / แนะนำให้ใช้แล้วแกว่ง?
Samiksha

1
มันเคยเกี่ยวข้อง ... 10 ปีที่ผ่านมา
บาร์ต

@Pacerier เขากำลังพูดถึง AWT ไม่ใช่ SWT

11

เท่าที่ AWT อาจมีประโยชน์มากกว่า Swing -

  • คุณอาจกำลังกำหนดเป้าหมาย JVM หรือแพลตฟอร์มที่เก่ากว่าซึ่งไม่สนับสนุน Swing สิ่งนี้เคยเล่นจริงๆถ้าคุณกำลังสร้าง Applets - คุณต้องการกำหนดเป้าหมายตัวส่วนร่วมที่ต่ำที่สุดเพื่อให้ผู้คนไม่ต้องติดตั้งปลั๊กอิน Java รุ่นใหม่ ฉันไม่แน่ใจว่าปลั๊กอิน Java รุ่นที่ติดตั้งกันอย่างแพร่หลายในปัจจุบันคืออะไรวันนี้อาจแตกต่างกัน
  • บางคนชอบรูปลักษณ์ดั้งเดิมของ AWT มากกว่าสกินของแพลตฟอร์ม "ไม่ค่อยมี" (มีสกินดั้งเดิมที่เป็นของบุคคลที่สามที่ดีกว่าการใช้งาน BTW ของ Swing) ผู้คนจำนวนมากต้องการใช้ FileDialog ของ AWT มากกว่า FileChooser ของ Swing เพราะมันให้บทสนทนาของไฟล์แพลตฟอร์มที่คนส่วนใหญ่คุ้นเคย

2
แต่สำหรับสุดท้ายเรายังสามารถสร้าง FileChooser ที่ดูเหมือนว่ากล่องโต้ตอบไฟล์ windows (แต่ไม่มีการเติมข้อความอัตโนมัติ) stackoverflow.com/q/17630055/2534090
JavaTechnical

9

ผลที่ตามมาหลายอย่างเกิดจากความแตกต่างระหว่าง AWT และ Swing

AWT เป็นโค้ดเลเยอร์บาง ๆ ที่ด้านบนของระบบปฏิบัติการในขณะที่ Swing มีขนาดใหญ่กว่ามาก สวิงยังมีฟังก์ชันที่สมบูรณ์ยิ่งขึ้น การใช้ AWT คุณต้องใช้หลายสิ่งด้วยตัวเองในขณะที่ Swing สร้างขึ้นมาสำหรับงานที่ต้องใช้ GUI มาก AWT ให้ความรู้สึกดั้งเดิมในการทำงานเมื่อเทียบกับ Swing เนื่องจาก Swing ใช้ฟังก์ชันการทำงานของ GUI เองแทนที่จะอาศัยระบบปฏิบัติการโฮสต์จึงสามารถเสนอสภาพแวดล้อมที่สมบูรณ์ยิ่งขึ้นบนทุกแพลตฟอร์มที่ Java ทำงาน AWT มีข้อ จำกัด มากขึ้นในการจัดหาฟังก์ชั่นเดียวกันในทุกแพลตฟอร์มเนื่องจากบางแพลตฟอร์มไม่ใช้ตัวควบคุมที่มีลักษณะเหมือนกันในรูปแบบเดียวกัน

คอมโพเนนต์การแกว่งถูกเรียกว่า "จริงจัง" เนื่องจากไม่จำเป็นต้องมีอ็อบเจ็กต์ OS ดั้งเดิมเพื่อใช้งานฟังก์ชัน JDialogและJFrameมีน้ำหนักมากเพราะพวกมันมีเพื่อน ดังนั้นส่วนประกอบเช่นJButton, JTextAreaฯลฯ มีน้ำหนักเบาเพราะไม่มีเพียร์ระบบปฏิบัติการ

เพียร์เป็นเครื่องมือที่จัดไว้ให้โดยระบบปฏิบัติการดังกล่าวเป็นวัตถุปุ่มหรือวัตถุฟิลด์รายการ


7

แกว่ง:

  1. Swing เป็นส่วนหนึ่งของคลาสพื้นฐาน java
  2. ส่วนประกอบการแกว่งนั้นไม่ขึ้นอยู่กับแพลตฟอร์ม
  3. ส่วนประกอบสวิงเป็นส่วนประกอบที่มีน้ำหนักเบาเนื่องจากการสวิงอยู่ด้านบนสุดของ awt

AWT:

  1. AWT เรียกว่าเครื่องมือหน้าต่างที่เป็นนามธรรม
  2. ส่วนประกอบ AWT ขึ้นอยู่กับแพลตฟอร์ม
  3. ส่วนประกอบ AWT เป็นส่วนประกอบของเฮฟวี่เวท

5
  • คอมโพเนนต์การแกว่งให้ส่วนต่อประสานผู้ใช้ที่ยืดหยุ่นมากเนื่องจากเป็นไปตามตัวควบคุม view view (mvc)
  • awt ไม่ได้อิง mvc
  • สวิงทำงานได้เร็วขึ้น
  • awt ไม่ทำงานเร็วขึ้น
  • ส่วนประกอบแกว่งมีน้ำหนักเบา
  • ส่วนประกอบ awt มีน้ำหนักมาก
  • สวิงใช้พื้นที่หน่วยความจำน้อยลง
  • awt ใช้พื้นที่หน่วยความจำมากขึ้น
  • องค์ประกอบการแกว่งเป็นแพลตฟอร์มอิสระ
  • awt ขึ้นอยู่กับแพลตฟอร์ม
  • สวิงต้องการแพคเกจ javax.swing
  • awt ต้องการแพ็กเกจ javax.awt

10
ฉันไม่คิดว่าการสวิงทำงานได้เร็วกว่า AWT เนื่องจาก AWT ใช้โค้ดเนม (รหัส gui) ที่มีอยู่แล้วในระบบปฏิบัติการ แต่การแกว่งสร้างส่วนประกอบทุกส่วนตั้งแต่เริ่มต้น ดังนั้น AWT อาจเร็วกว่า คุณช่วยบอกฉันหน่อยได้ไหมว่ามุมมองของคุณในการบอกว่าวงสวิงนั้นเร็วขึ้นเท่าไหร่? ขอบคุณ
JavaTechnical

3

AWT 1 AWT ใช้พื้นที่หน่วยความจำมากขึ้น 2 AWT ขึ้นอยู่กับแพลตฟอร์ม 3 AWT ต้องการแพ็คเกจ javax.awt

ชิงช้า 1 สวิงใช้พื้นที่หน่วยความจำน้อยกว่า 2 องค์ประกอบการแกว่งเป็นแพลตฟอร์มอิสระ 3 Swing ต้องการแพ็กเกจ javax.swing


1
คุณช่วยบอกฉันได้ไหมว่า AWT ใช้พื้นที่หน่วยความจำมากขึ้นได้อย่างไร เพราะมันใช้รหัสเนทีฟ
JavaTechnical

awt ต้องใช้ java.awt. *
abhisekp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.