Các thực tiễn tốt nhất về phát triển Java Swing là gì?


17

Trong khi thực hiện nghiên cứu trước cho câu hỏi này , tôi thấy rằng không có nhiều thông tin được tổ chức tốt về các thực tiễn tốt nhất về Java Swing trên Internet. Vì vậy, tôi nghĩ rằng tôi sẽ cho Stack Exchange một cú đánh vào việc xây dựng Danh sách tuyệt vời đó.

Các thực tiễn tốt nhất về phát triển Java Swing là gì? Những gì bạn đã tìm thấy để làm việc cho bạn, và tại sao?


2
Tôi đã chơi với Swing ở trường, và đó không phải là một trải nghiệm thú vị. Toàn bộ mọi thứ dường như cồng kềnh và phức tạp không cần thiết. Thực hành tốt nhất có thể là sử dụng một cái gì đó khác.
Robert Harvey

1
@RobertHarvey "chơi ở trường" khác xa với việc cung cấp phần mềm sản xuất. Tôi đã thấy rằng Swing có thể làm tất cả những gì được yêu cầu về nó một cách hợp lý, hợp lý.

Vâng, đặt nó theo cách này: Nếu nó là khó khăn đối với một dự án trường học đơn thuần, nó sẽ gần như khó khăn không thể tưởng tượng được trên một thực tế.
Robert Harvey

1
@RobertHarvey sức mạnh đi kèm với giá ...

Chỉ một điều quan trọng hơn. Các thành phần xoay được tuần tự hóa và có nhiều tổ tiên. Vì vậy, chúng quá nặng để kế thừa trong hầu hết các trường hợp. Bạn nên xem xét một số kỹ thuật gói, đặc biệt là khi bạn có một trạng thái không thể xác định. Nếu bạn kế thừa từ một thành phần, chỉ cần sử dụng nó làm dạng xem (trong MVC hoặc một mẫu tương tự).
Dávid Horváth

Câu trả lời:


12

Tôi chỉ có thể trả lời cho những gì làm việc cho tôi. Các nhà bình luận khác đã chỉ ra rằng các GUI Java nói chung rơi vào 'thung lũng kỳ lạ' về giao diện không hoàn toàn bản địa và tôi không tranh cãi về điều này.

Sử dụng tốt API hành động. Nó cho phép bạn đóng gói tốt hơn các hành động khác nhau mà người dùng của bạn sẽ thực hiện và cho phép bạn kết nối chúng với các phím tắt, phím tăng tốc, nút và các đối tượng đầu vào khác dễ dàng hơn nhiều.

Sử dụng một trình quản lý bố trí thích hợp. GridBagLayout là vô cùng mạnh mẽ, nhưng tôi sẽ đi xa hơn để nói rằng nó là không thể nhầm lẫn mà không có quá nhiều bình luận. Khi tôi chạy các công cụ phân tích mã tĩnh như Sonar trên một ứng dụng GUI cũ hơn mà tôi duy trì, nó luôn chỉ ra số lượng lớn các số ma thuật để bố trí GridBags vừa phải. Tôi đã gặt hái được nhiều thành công với GroupLayout, điều này tránh việc phải chỉ định căn chỉnh hoàn hảo pixel.

Nếu bạn nghĩ rằng bạn cần một JDialog ... có lẽ bạn không nên. Các hộp thoại thật kinh khủng, về mặt trải nghiệm người dùng - ứng dụng này đã quyết định sử dụng chúng cho mọi menu và hình thức, và để thực thi các quy tắc luôn luôn hàng đầu theo những cách kỳ quái. Điều này đã trở thành một cơn ác mộng bảo trì khi chúng ta thực sự cần phải cảnh báo điều gì đó qua menu. Cue bực bội khi nhấp vào các hộp thoại không thể tập trung - và do đó không thể chấp nhận được -.

Sử dụng SwingWorker thay vì cuộn đa luồng của riêng bạn, nếu thích hợp. Thật dễ dàng để mở rộng SwingWorker và thực hiện một số nhiệm vụ lâu dài trong khi cung cấp các cập nhật thường xuyên trở lại GUI. Hãy suy nghĩ tải về một bản cập nhật khách hàng. Nó sẽ xử lý lập lịch xử lý luồng công nhân cho bạn và cho phép bạn xuất bản phần trăm tải xuống trở lại chế độ xem, do đó bạn có thể cập nhật ProgressBar của bạn hoặc những gì có bạn.

Đó là tất cả những gì tôi có thể đề xuất, theo kinh nghiệm hạn chế được thừa nhận của tôi.


2
JDialoglà hoàn toàn tốt - miễn là bạn sử dụng nó cho các hộp thoại.
Jonas

1
Tôi đồng ý rằng họ vẫn ổn nếu bạn đang sử dụng chúng cho thông tin hoàn toàn phải được nhìn thấy - và hành động - ngay lập tức. Nhưng hầu hết thông tin thực sự không cần phải làm gián đoạn trải nghiệm người dùng nhiều như vậy. Đó là điểm đằng sau vòng loại của tôi.
Tom G

@Jonas Tôi nghĩ vấn đề là các hộp thoại là một điều xấu (không phân biệt chúng có được thực hiện JDialoghay không).
Tom Hawtin - tackline

1
Khớp nối có một chút về phía có mùi, nhưng IMO tốt hơn là viết mã luồng của riêng bạn. Tôi thà đối phó với mã không phù hợp hơn là các lỗi luồng tinh tế.
Tom G

3
Bạn có thể muốn xem MigLayout - Miglayout.com

4

Tôi muốn nói một trong những điều đầu tiên là không làm việc trực tiếp với nó. Hệ thống bố cục trong Swing (IMHO) rất tệ và cố gắng biến bất kỳ ứng dụng đáng kể nào ra khỏi nó là một cơn ác mộng.

Hai trong số nhiều trình quản lý bố cục thay thế mà tôi đã sử dụng là bố cục MigLayout và MultiSplitPane. MigLayout là mục đích chung hơn và làm cho bất kỳ bố cục nào bạn có thể nghĩ ra một cách dễ dàng, lành mạnh. MultiSplitPane cụ thể hơn; Tôi đã sử dụng nó để tạo một số bố cục đơn giản cho GUI không có nhiều phức tạp.

EDIT : Điều này không thay thế swing . Nếu bạn phải sử dụng Swing, bạn vẫn có thể sử dụng các trình quản lý Bố cục này vì chúng chỉ quản lý swing, không thay thế nó.


Tất nhiên thay thế tốt hơn là chỉ không sử dụng Swing. Swing bị chỉ trích nặng nề vì quá tệ khi làm việc cùng, không có vẻ gì là bản địa và chậm chạp. Nhiều lựa chọn thay thế tồn tại đã học được từ swing những điều không nên làm như Qt, SWT, và tôi nghĩ thậm chí GTK. Đây là những giải pháp lâu dài tuyệt vời cho những cơn đau đầu của Swing

EDIT : Như @Lord Torgamus đã nói, những thứ này không thực sự có sẵn nếu bạn buộc phải sử dụng Swing. Nếu bạn sẽ sử dụng những thứ tốt nhất này để giải quyết vấn đề này khi bạn tạo dự án của mình, thì không phải là 3/4 cách hay khi chọn các ứng dụng cũ.

Tôi cũng muốn lưu ý rằng hầu hết các GUI thay thế đều sử dụng các thư viện nguyên gốc để trông giống như hệ điều hành, sau đó quay trở lại Swing hoặc một số GUI Java thuần túy khác.


4
Tôi đánh giá cao ý kiến ​​của bạn, nhưng "không sử dụng Swing" không hữu ích cho những người kết thúc câu hỏi này vì họ bị buộc phải sử dụng Swing vì lý do này hay lý do khác.
Pops

@Lord Đó là lý do tại sao tôi đề xuất các trình quản lý bố cục thay thế trước khi đề xuất QT và SWT. Sử dụng bất cứ con đường nào bạn có thể.
TheLQ

"Hệ thống bố cục trong Swing (IMHO) thật tồi tệ và cố gắng biến bất kỳ ứng dụng đáng kể nào ra khỏi nó là một cơn ác mộng." Các trình quản lý Bố cục có xu hướng đến từ AWT, không phải Swing. Cấp, có một vài cái cụ thể của Swing, như BoxLayout và GroupLayout. Phải nói rằng, trình quản lý bố cục là hoàn toàn tùy chọn ... thay vào đó bạn có thể chỉ định tọa độ cho từng thành phần giống như bạn làm trong .NET WinForms (ngoại trừ .NET có GUI đẹp để làm điều đó cho bạn).
Powerlord

3
Hãy xem MigLayout - Miglayout.com

1
@TheLQ Ok Tôi đồng ý về trình quản lý tệp của Swing, cái đó thực sự ngu ngốc (Trên Mac OS X cũng vậy). Dù sao, tôi chỉ sử dụng trình quản lý tệp của AWT để khắc phục điều đó. Hoạt động tốt ngay cả khi phần còn lại của ứng dụng được thực hiện bằng cách sử dụng Swing.
stommestack
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.