Apa praktik terbaik dari pengembangan Java Swing?

17

Saat melakukan pra-penelitian untuk pertanyaan ini , saya menemukan bahwa tidak ada banyak informasi yang terorganisir dengan baik tentang praktik terbaik Java Swing di Internet. Jadi saya pikir saya akan memberikan Stack Exchange kesempatan untuk membangun One Great List itu.

Apa praktik terbaik dari pengembangan Java Swing? Apa yang Anda temukan bekerja untuk Anda, dan mengapa?

Pops
sumber
2
Saya bermain dengan Swing di sekolah, dan itu bukan pengalaman yang menyenangkan. Semuanya tampak membengkak dan tidak perlu rumit. Praktik terbaik mungkin menggunakan sesuatu yang lain.
Robert Harvey
1
@RobertHarvey "bermain di sekolah" jauh dari memberikan perangkat lunak produksi. Saya telah menemukan bahwa Swing dapat melakukan semua yang diminta darinya dengan cara yang masuk akal dan logis.
Baiklah, begini: Jika itu sulit pada proyek sekolah belaka, itu akan hampir tak terbayangkan sulit pada yang nyata.
Robert Harvey
1
Kekuatan @RobertHarvey hadir dengan harga ...
Satu hal lagi yang penting. Komponen ayun bersifat serial dan memiliki banyak leluhur. Jadi mereka terlalu berat untuk diwariskan dalam kebanyakan kasus. Anda harus mempertimbangkan beberapa teknik pembungkus, terutama ketika Anda memiliki kondisi yang tidak dapat digunakan. Jika Anda mewarisi dari suatu komponen, gunakan saja itu sebagai tampilan (dalam MVC atau pola serupa).
Dávid Horváth

Jawaban:

12

Saya hanya bisa menjawab apa yang berhasil bagi saya. Komentator lain telah menunjukkan bahwa GUI Jawa pada umumnya jatuh ke dalam 'lembah aneh' dengan tampilan dan nuansa yang tidak terlalu asli, dan saya tidak membantah ini.

Manfaatkan API Tindakan dengan baik. Ini memungkinkan Anda merangkum berbagai tindakan yang akan dilakukan oleh pengguna dan memungkinkan Anda untuk menghubungkannya dengan pintasan, tombol akselerator, tombol, dan objek input lainnya dengan lebih mudah.

Gunakan manajer tata letak yang sesuai. GridBagLayout sangat kuat, tapi saya akan mengatakan bahwa itu tidak dapat dipertahankan tanpa jumlah komentar yang berlebihan. Ketika saya menjalankan alat analisis kode statis seperti Sonar pada aplikasi GUI yang lebih lama saya pertahankan, selalu menunjukkan jumlah angka ajaib yang sangat besar untuk membuat tata letak GridBags tepat. Saya sudah banyak sukses dengan GroupLayout, yang menghindari keharusan menentukan penyelarasan piksel-sempurna.

Jika Anda pikir Anda memerlukan JDialog ... Anda mungkin tidak. Kotak dialog mengerikan, dalam hal pengalaman pengguna - aplikasi ini memutuskan untuk menggunakannya untuk setiap menu dan formulir, dan untuk menegakkan aturan yang selalu ada di atas dengan cara yang aneh. Ini berubah menjadi mimpi buruk pemeliharaan ketika kami benar-benar perlu mengingatkan sesuatu pada menu. Cue frustrasi mengklik dialog yang tidak fokus - dan karenanya tidak bisa dihilangkan -.

Gunakan SwingWorker daripada menggulir multithreading Anda sendiri, jika perlu. Sangat mudah untuk memperpanjang SwingWorker dan melakukan tugas jangka panjang sambil memberikan pembaruan rutin kembali ke GUI. Pikirkan mengunduh pembaruan klien. Ini akan menangani penjadwalan utas pekerja untuk Anda dan memungkinkan Anda menerbitkan persentase unduhan kembali ke tampilan, sehingga Anda dapat memperbarui ProgressBar Anda atau apa pun yang Anda miliki.

Hanya itu yang bisa saya sarankan, dalam pengalaman yang diakui terbatas.

Tom G
sumber
2
JDialogbaik-baik saja - selama Anda menggunakannya untuk dialog.
Jonas
1
Saya setuju mereka baik-baik saja jika Anda menggunakannya untuk informasi yang benar-benar harus dilihat - dan ditindaklanjuti - segera. Tetapi sebagian besar informasi benar-benar tidak perlu mengganggu pengalaman pengguna sebanyak itu. Itulah titik di belakang kualifikasi saya.
Tom G
@Jonas Saya pikir intinya adalah bahwa dialog adalah hal yang buruk (terlepas dari apakah mereka diimplementasikan dengan JDialogatau tidak).
Tom Hawtin - tackline
1
Koplingnya agak sedikit berbau, tetapi lebih baik IMO daripada menulis kode threading Anda sendiri. Saya lebih suka berurusan dengan kode inelegant daripada bug thread halus.
Tom G
3
Anda mungkin ingin melihat MigLayout - miglayout.com
4

Saya akan mengatakan salah satu hal pertama adalah tidak bekerja secara langsung. Sistem tata letak di Swing (IMHO) mengerikan, dan mencoba membuat aplikasi substansial darinya adalah mimpi buruk.

Dua dari banyak manajer tata letak alternatif yang saya gunakan adalah tata letak MigLayout dan MultiSplitPane. MigLayout adalah tujuan yang lebih umum dan membuat tata letak yang dapat Anda pikirkan dengan cara yang mudah dan waras. MultiSplitPane lebih spesifik; Saya menggunakannya untuk membuat beberapa layout sederhana untuk GUI yang tidak memiliki banyak kerumitan.

EDIT : Ini tidak menggantikan ayunan . Jika Anda harus menggunakan Swing, Anda masih dapat menggunakan manajer Layout ini karena mereka hanya mengelola swing, bukan menggantinya.


Tentu saja alternatif yang lebih baik adalah tidak menggunakan Swing. Swing sangat dikritik karena mengerikan untuk dikerjakan, tidak terlihat asli , dan lambat. Ada banyak alternatif yang telah belajar dari ayunan apa yang tidak boleh dilakukan seperti Qt, SWT, dan saya pikir bahkan GTK. Ini adalah solusi jangka panjang yang bagus untuk sakit kepala Swing

EDIT : Seperti @Lord Torgamus mengatakan, ini tidak benar-benar tersedia jika Anda dipaksa untuk menggunakan Swing. Jika Anda akan menggunakan ini yang terbaik untuk menyelesaikan ini ketika Anda membuat proyek Anda, bukan 3/4 jalan melalui atau ketika mengambil aplikasi lawas.

Saya juga ingin mencatat bahwa sebagian besar GUI alternatif menggunakan pustaka asli agar terlihat seperti sistem operasi, kemudian kembali ke Swing atau GUI Java Murni lainnya.

TheLQ
sumber
4
Saya menghargai pendapat Anda, tetapi "jangan gunakan Swing" tidak membantu bagi orang yang akhirnya pada pertanyaan ini karena mereka dipaksa untuk menggunakan Swing karena satu dan lain alasan.
Pops
@ Tuhan Itulah sebabnya saya menyarankan manajer tata letak alternatif sebelum menyarankan QT dan SWT. Gunakan jalur mana pun yang Anda bisa.
TheLQ
"Sistem tata letak di Swing (IMHO) mengerikan, dan mencoba membuat aplikasi substansial darinya adalah mimpi buruk." Manajer Tata Letak cenderung berasal dari AWT, bukan Swing. Memang, ada beberapa yang spesifik Swing, seperti BoxLayout dan GroupLayout. Karena itu, manajer tata letak sepenuhnya opsional ... Anda bisa menentukan koordinat untuk setiap komponen seperti yang Anda lakukan di. WinForms NET (kecuali. NET memiliki GUI yang bagus untuk melakukannya untuk Anda).
Powerlord
3
Lihatlah MigLayout - miglayout.com
1
@TheLQ Oke, saya setuju tentang pengelola file Swing, yang itu benar-benar bodoh (Di Mac OS X juga). Bagaimanapun, saya hanya menggunakan file manager AWT untuk memperbaikinya. Bekerja dengan baik bahkan jika sisa aplikasi dibuat menggunakan Swing.
stommestack