Sự khác biệt giữa Swing và AWT là gì?


Câu trả lời:


235

AWT là giao diện Java với mã GUI hệ thống gốc có trong HĐH của bạn. Nó sẽ không hoạt động giống nhau trên mọi hệ thống, mặc dù nó cố gắng.

Swing là một GUI Java thuần túy ít nhiều. Nó sử dụng AWT để tạo cửa sổ hệ điều hành và sau đó vẽ hình ảnh của các nút, nhãn, văn bản, hộp kiểm, v.v. vào cửa sổ đó và phản hồi tất cả các lần nhấp chuột, các mục chính, v.v., tự quyết định việc cần làm thay vì để hệ điều hành xử lý nó. Do đó, Swing có thể di động 100% và giống nhau trên các nền tảng (mặc dù nó có thể nhìn được và có "giao diện có thể cắm được" có thể khiến nó trông giống hoặc ít hơn các cửa sổ và widget gốc trông như thế nào).

Đây là những cách tiếp cận rất khác nhau đối với các bộ công cụ GUI và có rất nhiều hậu quả. Một câu trả lời đầy đủ cho câu hỏi của bạn sẽ cố gắng khám phá tất cả những câu hỏi đó. :) Đây là một cặp vợ chồng:

AWT là một giao diện đa nền tảng, do đó, mặc dù nó sử dụng hệ điều hành GUI hoặc bộ công cụ GUI gốc cho chức năng của nó, nó không cung cấp quyền truy cập vào mọi thứ mà những bộ công cụ đó có thể làm. Các widget AWT nâng cao hoặc mới hơn có thể tồn tại trên một nền tảng có thể không được hỗ trợ trên nền tảng khác. Các tính năng của các widget không giống nhau trên mọi nền tảng có thể không được hỗ trợ hoặc tệ hơn là chúng có thể hoạt động khác nhau trên mỗi nền tảng. Mọi người thường đầu tư rất nhiều nỗ lực để khiến các ứng dụng AWT của họ hoạt động ổn định trên các nền tảng - ví dụ, họ có thể cố gắng thực hiện các cuộc gọi thành mã gốc từ Java.

Vì AWT sử dụng các widget GUI gốc, HĐH của bạn biết về chúng và xử lý đặt chúng trước mặt nhau, v.v., trong khi các widget Swing là các pixel vô nghĩa trong một cửa sổ theo quan điểm của HĐH. Swing tự xử lý bố trí và xếp chồng vật dụng của bạn. Trộn AWT và Swing rất không được hỗ trợ và có thể dẫn đến kết quả lố bịch, chẳng hạn như các nút gốc che khuất mọi thứ khác trong hộp thoại mà chúng cư trú vì mọi thứ khác được tạo bằng Swing.

Vì Swing cố gắng làm mọi thứ có thể trong Java ngoài các thói quen đồ họa rất thô được cung cấp bởi cửa sổ GUI gốc, nên nó được sử dụng để chịu một hình phạt hiệu năng khá cao so với AWT. Điều này làm cho Swing không may bị chậm để bắt kịp. Tuy nhiên, điều này đã bị thu hẹp đáng kể trong vài năm qua do các JVM được tối ưu hóa hơn, máy móc nhanh hơn và (tôi đoán) tối ưu hóa các phần bên trong Swing. Ngày nay, một ứng dụng Swing có thể chạy đủ nhanh để có thể sử dụng được hoặc thậm chí là nhanh, và gần như không thể phân biệt được với một ứng dụng sử dụng các widget gốc. Một số người sẽ nói rằng phải mất quá nhiều thời gian để đi đến điểm này, nhưng hầu hết sẽ nói rằng nó rất xứng đáng.

Cuối cùng, bạn cũng có thể muốn kiểm tra SWT (bộ công cụ GUI được sử dụng cho Eclipse và một giải pháp thay thế cho cả AWT và Swing), phần nào trở lại ý tưởng AWT về việc truy cập các Widget gốc thông qua Java.


Ừm ... đã thực hiện một số Swing khá rộng trên nhiều nền tảng, tôi có thể nói với bạn rằng nó rất không giống nhau trên các nền tảng. Giống? Chắc chắn rồi. Tương tự? Không đời nào.
cletus

1
Các vấn đề nặng / nhẹ sẽ biến mất trong bản cập nhật Java 6 12 (xem java.dzone.com/news/a-farewell-ematvy weightlightwei ).
Dan Dyer

Ồ Tôi không thể tin rằng họ có thể sửa nó, và tôi vẫn không thể tin rằng việc trộn các thành phần nhẹ và nặng sẽ là điều mong muốn. Nhưng thật không thể tin được là họ có thể sửa nó.
Skiphoppy

Hãy quên cả hai đi. Hãy xem WPF. :)
Alper Ozcetin

3
Đây là một bài viết Java chính thức xác nhận rằng việc trộn đã được sửa: oracle.com/technetwork/articles/java/iêu
user193130

35

Sự khác biệt cơ bản mà mọi người đã đề cập là một trọng lượng nặng và khác là trọng lượng nhẹ . Để tôi giải thích, về cơ bản, thuật ngữ nặng có nghĩa là gì khi bạn sử dụng các thành phần awt, mã gốc được sử dụng để lấy thành phần khung nhìn được tạo bởi Hệ điều hành , đó là lý do tại sao giao diện của nó thay đổi từ HĐH sang HĐH. Trong trường hợp như trong các thành phần swing, trách nhiệm của JVM là tạo ra khung nhìn cho các thành phần. Một tuyên bố khác mà tôi thấy là swing là dựa trên MVC và awt thì không.


14
trên thực tế, Swing sử dụng cách tiếp cận Model-Delegate, bắt nguồn từ cách tiếp cận MVC, trong đó trong Chế độ xem và Trình điều khiển được kết hợp cho cấu trúc Delegate
Purushottam

15

Xoay so với AWT . Về cơ bản AWT xuất hiện đầu tiên và là một tập hợp các thành phần UI hạng nặng (có nghĩa là chúng là các hàm bao cho các đối tượng hệ điều hành) trong khi Swing được xây dựng trên đỉnh AWT với một bộ các thành phần nhẹ phong phú hơn.

Bất kỳ công việc UI Java nghiêm túc nào cũng được thực hiện trong Swing not AWT, chủ yếu được sử dụng cho các applet.


1
Có trường hợp nào awt hữu ích hơn / khuyên nên sử dụng sau đó swing không?
Samiksha

1
Nó từng có liên quan ... 10 năm trước.
bart

@Pacerier anh ấy đã nói về AWT, không phải SWT

11

Cho đến khi AWT có thể hữu ích hơn so với Swing -

  • bạn có thể đang nhắm mục tiêu một JVM cũ hơn hoặc nền tảng không hỗ trợ Swing. Điều này từng thực sự phát huy tác dụng nếu bạn đang xây dựng Applet - bạn muốn nhắm mục tiêu mẫu số chung thấp nhất để mọi người không phải cài đặt một plugin Java mới hơn. Tôi không chắc phiên bản plugin Java được cài đặt rộng rãi nhất hiện nay là gì - phiên bản này có thể khác ngày hôm nay.
  • một số người thích giao diện gốc của AWT hơn giao diện nền tảng 'không hoàn toàn ở đó' của Swing. .

2
Nhưng đối với người cuối cùng, chúng tôi cũng có thể tạo một FileChooser rằng có rất nhiều ngoại hình khá giống như hộp thoại cửa sổ tập tin (nhưng không có autocomplete) stackoverflow.com/q/17630055/2534090
JavaTechnical

9

Một số hậu quả do sự khác biệt này giữa AWT và Swing.

AWT là một lớp mã mỏng trên hệ điều hành, trong khi Swing lớn hơn nhiều. Swing cũng có chức năng phong phú hơn rất nhiều. Khi sử dụng AWT, bạn phải tự thực hiện rất nhiều thứ, trong khi Swing được tích hợp sẵn. Đối với công việc chuyên sâu về GUI, AWT cảm thấy rất nguyên thủy khi làm việc so với Swing. Vì Swing thực hiện chính chức năng GUI thay vì dựa vào HĐH máy chủ, nên nó có thể cung cấp một môi trường phong phú hơn trên tất cả các nền tảng mà Java chạy. AWT bị hạn chế hơn trong việc cung cấp cùng chức năng trên tất cả các nền tảng vì không phải tất cả các nền tảng đều thực hiện các điều khiển giống nhau theo cùng một cách.

Các thành phần xoay được gọi là "nhẹ" vì chúng không yêu cầu đối tượng HĐH gốc thực hiện chức năng của chúng. JDialogJFramelà nặng, bởi vì họ có một đồng đẳng. Vì vậy, các thành phần như JButton, JTextAreav.v., rất nhẹ vì chúng không có hệ điều hành ngang hàng.

Một ngang hàng là một tiện ích được cung cấp bởi hệ điều hành, chẳng hạn như một đối tượng nút hoặc một đối tượng lĩnh vực nhập cảnh.


7

Lung lay:

  1. Swing là một phần của các lớp nền tảng java.
  2. Các thành phần swing là độc lập nền tảng.
  3. Các thành phần swing là các thành phần nhẹ bởi vì swing nằm trên đỉnh của awt.

AWT:

  1. AWT được gọi là công cụ cửa sổ trừu tượng.
  2. Các thành phần AWT phụ thuộc vào nền tảng.
  3. Các thành phần AWT là các thành phần nặng.

5
  • thành phần swing cung cấp giao diện người dùng linh hoạt hơn nhiều vì nó tuân theo bộ điều khiển xem mô hình (mvc).
  • awt không dựa trên mvc.
  • swing hoạt động nhanh hơn.
  • awt không hoạt động nhanh hơn
  • thành phần swing có trọng lượng nhẹ.
  • thành phần awt là trọng lượng nặng.
  • swing chiếm ít không gian bộ nhớ.
  • awt chiếm nhiều không gian bộ nhớ.
  • thành phần swing là nền tảng độc lập.
  • awt là nền tảng phụ thuộc.
  • swing yêu cầu gói javax.swing.
  • awt yêu cầu gói javax.awt.

10
Tôi không nghĩ swing hoạt động nhanh hơn AWT vì AWT sử dụng mã gốc (mã gui) đã có trong HĐH nhưng swing xây dựng mọi thành phần từ đầu. Vì vậy AWT có thể nhanh hơn. Bạn có thể nói cho tôi biết quan điểm của bạn khi nói swing hoạt động nhanh hơn không? Cảm ơn.
JavaT kỹ thuật

3

AWT 1. AWT chiếm nhiều không gian bộ nhớ hơn 2. AWT là nền tảng phụ thuộc 3. AWT yêu cầu gói javax.awt

xích đu 1. Xích chiếm ít không gian bộ nhớ 2. Thành phần swing là nền tảng độc lập 3. Swing yêu cầu gói javax.swing


1
Bạn có thể nói cho tôi biết làm thế nào để AWT chiếm nhiều không gian bộ nhớ hơn không? Bởi vì nó sử dụng mã gốc?
JavaT kỹ thuật

awt yêu cầu java.awt. *
abhisekp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.