Beberapa kali saya dikritik karena menyarankan penggunaan metode berikut:
- setPreferredSize
- setMinimumSize
- setMaximumSize
pada Swing
komponen. Saya tidak melihat alternatif untuk penggunaannya ketika saya ingin menentukan proporsi antara komponen yang ditampilkan. Saya telah diberitahu ini:
Dengan tata letak, jawabannya selalu sama: gunakan LayoutManager yang cocok
Saya telah mencari di web sedikit, tetapi saya belum menemukan analisis yang komprehensif dari subjek. Jadi saya punya pertanyaan berikut:
- Haruskah saya sepenuhnya menghindari penggunaan metode-metode itu?
- Metode telah ditetapkan karena suatu alasan. Jadi kapan saya harus menggunakannya? Dalam konteks apa? Untuk tujuan apa?
- Apa sebenarnya konsekuensi negatif dari penggunaan metode tersebut? (Saya hanya bisa berpikir menambahkan portabilitas antara sistem dengan resolusi layar yang berbeda).
- Saya tidak berpikir LayoutManager dapat dengan tepat memenuhi semua kebutuhan tata letak yang diinginkan. Apakah saya benar-benar perlu menerapkan LayoutManager baru untuk setiap variasi kecil pada layout saya?
- Jika jawaban ke 4 adalah "ya", tidakkah ini akan menyebabkan proliferasi kelas LayoutManager yang akan menjadi sulit dipertahankan?
- Dalam situasi di mana saya perlu menentukan proporsi antara anak-anak dari Komponen (misalnya, child1 harus menggunakan 10% ruang, child2 40%, child3 50%), apakah mungkin untuk mencapai itu tanpa menerapkan LayoutManager kustom?
sumber
JEditorPane
dengan HTML yang tidak dengan sendirinya menyarankan lebar. OTOH Saya tidak yakin apakah saya melewatkan sesuatu. Saya akan dengan hati-hati meninjau balasan di utas, tetapi tertarik jika Anda memiliki komentar, terutama pada kasus terakhir.Beberapa heuristik:
Jangan gunakan
set[Preferred|Maximum|Minimum]Size()
ketika Anda benar-benar bermaksud menimpaget[Preferred|Maximum|Minimum]Size()
, seperti yang mungkin dilakukan dalam membuat komponen Anda sendiri, yang ditunjukkan di sini .Jangan gunakan
set[Preferred|Maximum|Minimum]Size()
saat Anda bisa mengandalkan komponen yang diganti dengan hati-hatigetPreferred|Maximum|Minimum]Size
, seperti yang ditunjukkan di sini dan di bawah.Gunakan
set[Preferred|Maximum|Minimum]Size()
untuk mendapatkan post-validate()
geometri, seperti yang ditunjukkan di bawah dan di sini .Jika komponen tidak memiliki ukuran yang disukai, misalnya
JDesktopPane
, Anda mungkin harus mengukur wadahnya, tetapi pilihan semacam itu sewenang-wenang. Sebuah komentar dapat membantu memperjelas maksudnya.Pertimbangkan tata letak alternatif atau kustom ketika Anda menemukan bahwa Anda harus mengulang-ulang banyak komponen untuk mendapatkan ukuran turunan, seperti yang disebutkan dalam komentar ini .
sumber
setPreferredSize()
selalu mengganti perhitungan komponen dengan pilihan sewenang-wenang.Tidak, tidak ada bukti formal untuk menyarankan memanggil atau mengganti metode ini tidak diperbolehkan. Bahkan, Oracle mengatakan metode ini digunakan untuk memberikan petunjuk ukuran: http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html#sizealignment .
Mereka juga dapat diganti (yang merupakan praktik terbaik untuk Swing) ketika memperluas komponen Swing (daripada memanggil metode pada instance komponen kustom)
Yang paling penting tidak peduli bagaimana Anda menentukan ukuran komponen Anda, pastikan bahwa wadah komponen Anda menggunakan manajer tata letak yang menghormati ukuran komponen yang diminta.
Saat Anda perlu memberikan petunjuk ukuran khusus kepada pengelola Tata Letak wadah sehingga komponen akan ditata dengan baik
Banyak manajer tata letak tidak memperhatikan ukuran maksimum komponen yang diminta. Namun,
BoxLayout
danSpringLayout
lakukan. Selain itu,GroupLayout
memberikan kemampuan untuk mengatur ukuran minimum, disukai atau maksimum secara eksplisit, tanpa menyentuh komponen.Pastikan Anda benar-benar perlu mengatur ukuran persis komponen. Setiap komponen Swing memiliki ukuran pilihan yang berbeda, tergantung pada font yang digunakan dan tampilan serta rasa. Dengan demikian memiliki ukuran yang diatur dapat menghasilkan tampilan yang bervariasi dari UI pada Sistem yang berbeda
kadang-kadang masalah dapat ditemui
GridBagLayout
dan bidang teks, di mana jika ukuran wadah lebih kecil dari ukuran yang disukai, ukuran minimum digunakan, yang dapat menyebabkan bidang teks menyusut cukup banyak.JFrame
tidak memaksakan overridengetMinimumSize()
hanya memanggilsetMinimumSize(..)
pekerjaannyaJika dengan menerapkan maksud Anda menggunakan maka ya. Tidak ada yang
LayoutManger
bisa menangani semuanya, masingLayoutManager
- masing memiliki pro dan kontra sehingga masing-masing dapat digunakan bersama untuk menghasilkan tata letak akhir.Referensi:
sumber
setXxxSize
metode sebagai bendera merah yang saya mungkin berakhir di sini , bahkan ketika dokumen menyarankannya. Saya hampir selalu harus ditimpagetXxxSize
, di mana seseorang memiliki akses ke geometri yang diperlukan; dan bahkan contoh singkat dapat didaur ulang lebih dari yang ingin saya pikirkan. +1 untuk menyebutkan variasi di antara pengelola tata letak dan mengutip tutorial.Ada banyak jawaban bagus di sini, tetapi saya ingin menambahkan sedikit tentang alasan mengapa Anda biasanya harus menghindari ini (pertanyaan baru saja muncul lagi dalam topik rangkap):
Dengan beberapa pengecualian, jika Anda menggunakan metode ini, Anda mungkin sedang menyesuaikan GUI agar terlihat bagus pada tampilan-dan-nuansa tertentu (dan dengan pengaturan khusus sistem Anda, mis. Font desktop pilihan Anda, dll.). Metode itu sendiri pada dasarnya tidak jahat, tetapi alasan khas untuk menggunakannya adalah . Segera setelah Anda mulai menyetel posisi dan ukuran piksel dalam tata letak, Anda berisiko melanggar GUI Anda (atau paling tidak, terlihat buruk), pada platform lain.
Sebagai contohnya, cobalah mengubah tampilan dan nuansa aplikasi Anda. Bahkan hanya dengan opsi yang tersedia di platform Anda, Anda mungkin akan terkejut melihat betapa buruknya hasil yang dapat diberikan.
Jadi, atas nama menjaga GUI Anda fungsional dan terlihat bagus di semua platform (ingat, salah satu manfaat utama Java adalah cross-platformness), Anda harus mengandalkan manajer tata letak, dll., Untuk secara otomatis menyesuaikan ukuran komponen Anda sehingga ditampilkan dengan benar di luar lingkungan pengembangan spesifik Anda.
Semua yang dikatakan, Anda tentu bisa membayangkan situasi di mana metode ini dibenarkan. Sekali lagi, mereka secara inheren tidak jahat, tetapi penggunaannya biasanya merupakan bendera merah besar yang menunjukkan potensi masalah GUI. Pastikan Anda sadar akan potensi komplikasi yang tinggi jika / ketika Anda menggunakannya, dan selalu coba dan pikirkan jika ada solusi lain yang terlihat dan terasa independen untuk masalah Anda - lebih sering Anda akan menemukan bahwa ini metode tidak perlu.
Omong-omong, jika Anda merasa frustrasi dengan manajer tata letak standar, ada banyak yang bagus, sumber pihak ketiga sumber terbuka, misalnya JGoodies
FormLayout
, atauMigLayout
. Beberapa pembangun GUI bahkan memiliki dukungan bawaan untuk pengelola tata letak pihak ketiga - editor GUI WindowBuilder Eclipse, misalnya, dikirimkan dengan dukungan untukFormLayout
danMigLayout
.sumber
JTextField.setColumns
untuk mengatur jumlah kolom, yang menyesuaikan ukuran yang diinginkan sesuai. Jika Anda melakukannya,setPreferredSize
maka Anda sedang mengkodekan ukuran, yang akan memecah tata letak Anda tergantung pada ukuran font platform. Berikut adalah beberapa bidang teks dalam tata letak tas kisi dengansetColumns
disebut tepat . Untuk tombol Anda, gunakan tata letak / bobot grid yang tepat untuk mengontrol ukuran.Jika Anda mengalami masalah dengan tata letak di Java Swing, maka saya bisa sangat merekomendasikan JGoodies yang
FormLayout
disediakan secara bebas sebagai bagian dari perpustakaan freeware Formulir oleh Karsten Lentzsch di sini .Manajer tata letak yang sangat populer ini sangat fleksibel, memungkinkan untuk dikembangkan UI Java yang sangat halus.
Anda akan menemukan dokumentasi Karsten di sini , dan beberapa dokumentasi yang agak bagus dari gerhana di sini .
sumber
Metode-metode ini kurang dipahami oleh kebanyakan orang. Anda harus benar-benar tidak mengabaikan metode ini. Terserah manajer tata letak jika mereka menghormati metode ini. Halaman ini memiliki tabel yang menunjukkan manajer tata letak mana yang menghargai metode mana yang:
http://thebadprogrammer.com/swing-layout-manager-sizing/
Saya telah menulis kode Swing selama 8+ tahun dan manajer tata letak yang termasuk dalam JDK selalu memenuhi kebutuhan saya. Saya tidak pernah membutuhkan manajer tata letak pihak ke-3 untuk mencapai tata letak saya.
Saya akan mengatakan bahwa Anda tidak harus mencoba memberikan petunjuk tata letak manajer dengan metode ini sampai Anda yakin Anda membutuhkannya. Lakukan tata letak Anda tanpa memberikan petunjuk ukuran (mis. Biarkan pengelola tata letak melakukan tugasnya) dan kemudian Anda dapat membuat koreksi kecil jika perlu.
sumber
Mungkin
GridBagLayout
akan memuaskan kebutuhan Anda. Selain itu, ada banyak manajer tata letak di web, dan saya yakin ada satu yang sesuai dengan kebutuhan Anda.sumber
Saya melihatnya berbeda dari jawaban yang diterima.
1) Haruskah saya sepenuhnya menghindari penggunaan metode-metode itu?
Jangan pernah menghindar! Mereka ada di sana untuk mengekspresikan batasan ukuran komponen Anda ke manajer tata letak. Anda dapat menghindari menggunakannya jika Anda tidak menggunakan pengelola tata letak apa pun dan mencoba mengelola tata letak visual sendiri.
Sayangnya, Swing tidak hadir dengan dimensi standar yang wajar. Namun, alih-alih mengatur dimensi komponen, lebih baik OOP untuk menurunkan komponen Anda sendiri dengan standar yang wajar. (Dalam hal ini Anda memanggil setXXX di kelas turunan Anda.) Atau, Anda dapat mengganti metode getXXX untuk efek yang sama.
2) Metode telah ditetapkan karena suatu alasan. Jadi kapan saya harus menggunakannya? Dalam konteks apa? Untuk tujuan apa?
Selalu. Saat Anda membuat komponen, atur ukuran min / prefer / max yang realistis sesuai dengan penggunaan komponen itu. Misalnya, jika Anda memiliki JTextField untuk memasukkan simbol negara seperti Inggris, ukuran pilihannya akan selebar dua karakter (dengan font saat ini, dll.) Tetapi mungkin tidak ada artinya membiarkannya tumbuh lebih besar. Bagaimanapun, simbol negara adalah dua karakter. Sebaliknya, jika Anda memiliki JTextField untuk memasukkan misalnya nama pelanggan, itu bisa memiliki ukuran yang disukai untuk seperti ukuran piksel untuk 20 karakter, tetapi dapat tumbuh menjadi lebih besar jika tata letak diubah ukurannya, jadi atur ukuran maksimum menjadi lebih banyak. Pada saat yang sama, memiliki lebar JTextField 0px tidak ada gunanya, jadi atur ukuran minimum yang realistis (saya akan mengatakan ukuran piksel 2 karakter).
3) Apa sebenarnya konsekuensi negatif dari penggunaan metode tersebut?
(Saya hanya bisa berpikir menambahkan portabilitas antara sistem dengan resolusi layar yang berbeda).
Tidak ada konsekuensi negatif. Ini adalah petunjuk untuk pengelola tata letak.
4) Saya tidak berpikir LayoutManager dapat dengan tepat memenuhi semua kebutuhan tata letak yang diinginkan.
Apakah saya benar-benar perlu menerapkan LayoutManager baru untuk setiap variasi kecil pada layout saya?
Tidak, tentu saja tidak. Pendekatan yang biasa dilakukan adalah dengan memanipulasi tata letak dasar yang berbeda seperti tata letak horizontal dan vertikal.
Misalnya, tata letak di bawah ini:
memiliki dua bagian. Bagian kiri dan kanan adalah tata letak horizontal. Bagian kanan adalah JPanel yang ditambahkan ke tata letak horizontal, dan JPanel ini memiliki tata letak vertikal yang menjabarkan tombol-tombol secara vertikal.
Tentu saja, ini bisa menjadi rumit dengan tata letak kehidupan nyata. Oleh karena itu manajer tata letak berbasis kisi seperti MigLayout jauh lebih baik jika Anda ingin mengembangkan sesuatu yang serius.
5) Jika jawaban ke 4 adalah "ya", tidakkah ini akan menyebabkan proliferasi kelas LayoutManager yang akan menjadi sulit dipertahankan?
Tidak, Anda pasti tidak akan mengembangkan manajer tata letak, kecuali jika Anda memerlukan sesuatu yang sangat istimewa.
6) Dalam situasi di mana saya perlu mendefinisikan proporsi ...
antara anak-anak dari Komponen (misalnya, child1 harus menggunakan ruang 10%, child2 40%, child3 50%), apakah mungkin untuk mencapai itu tanpa menerapkan LayoutManager kustom?
Pada dasarnya, setelah ukuran yang diinginkan diatur dengan benar, Anda mungkin tidak ingin melakukan apa pun dalam persentase. Sederhananya, karena persentase tidak ada gunanya (misalnya tidak ada gunanya memiliki JTextField 10% dari ukuran jendela - karena seseorang dapat mengecilkan jendela sehingga JTextField menjadi lebar 0px, atau dapat memperluas jendela sehingga JTextField berada di dua tampilan pada sebuah layar pengaturan multi-display).
Tapi, mungkin kali Anda dapat menggunakan persentase untuk mengontrol ukuran blok bangunan yang lebih besar dari gui Anda (panel, misalnya).
Anda dapat menggunakan JSplitPane di mana Anda dapat mengatur sebelumnya rasio kedua sisi. Atau, Anda dapat menggunakan MigLayout yang memungkinkan Anda mengatur batasan seperti itu dalam persentase, piksel, dan unit lainnya.
sumber
btnBar.setPreferredSize( dimTouchBtn );
adalah cara terbaik untuk melakukan itu. Mudah, tidak perlu manajer tata letak khusus. Saya menggunakan sebagian besarGridBagLayout
dengan beberapaBorderLayout
danBoxLayout
, bersarang saat nyaman. Ini adalah kombinasi yang kuat dan mudah digunakan.Haruskah saya sepenuhnya menghindari penggunaan metode-metode itu? Saya tidak akan mengatakan "hindari" mereka. Saya akan mengatakan bahwa jika Anda berpikir Anda membutuhkannya, Anda mungkin melakukan sesuatu yang salah. Ukuran komponen ditentukan dalam konteks. Misalnya, ukuran komponen teks ditentukan oleh jumlah baris dan kolom yang Anda tentukan, dikombinasikan dengan font yang Anda pilih. Tombol dan ukuran label Anda akan menjadi ukuran grafik, jika Anda mengaturnya, atau ruang yang diperlukan untuk menampilkan teks yang Anda atur. Setiap komponen memiliki ukuran alami, dan manajer tata letak akan menggunakannya untuk meletakkan semuanya tanpa Anda perlu menentukan ukuran. Pengecualian utama adalah JScrollPane, yang memiliki ukuran independen dari apa pun yang dikandungnya. Bagi mereka, saya kadang-kadang akan menelepon
setSize()
, dan membiarkan ukuran itu menentukan ukuran jendela awal, dengan meneleponJFrame.pack()
. Biasanya, saya akan membiarkan ukuran jendela menentukan ukuran JScrollPane. Pengguna akan menentukan ukuran jendela. Banyak manajer tata letak mengabaikan ukuran yang Anda tetapkan, jadi mereka sering tidak berbuat banyak.Metode telah ditetapkan karena suatu alasan. Jadi kapan saya harus menggunakannya? Dalam konteks apa? Untuk tujuan apa? Saya percaya mereka ditambahkan untuk memberikan petunjuk kepada manajer tata letak. Mereka mungkin telah ditulis karena alasan historis, karena manajer tata letak adalah baru, dan orang-orang tidak sepenuhnya mempercayai mereka. Saya tahu beberapa pengembang yang menghindari manajer tata letak dan meletakkan semuanya secara manual, hanya karena mereka tidak mau repot-repot mempelajari paradigma baru. Itu ide yang buruk.
Apa sebenarnya konsekuensi negatif dari penggunaan metode tersebut? (Saya hanya bisa berpikir menambahkan portabilitas antara sistem dengan resolusi layar yang berbeda). Mereka tidak efektif, dan mereka menghasilkan tata letak yang buruk, dengan benda yang diperas atau ditarik ke ukuran non-alami. Dan tata letak akan rapuh. Perubahan ukuran jendela kadang-kadang akan merusak tata letak dan meletakkan segala sesuatu di tempat yang salah.
Saya tidak berpikir LayoutManager dapat dengan tepat memenuhi semua kebutuhan tata letak yang diinginkan. Apakah saya benar-benar perlu menerapkan LayoutManager baru untuk setiap variasi kecil pada layout saya? Anda seharusnya tidak "menerapkan" Manajer Layout baru. Anda harus instantiate yang sudah ada. Saya sering menggunakan beberapa manajer tata letak dalam satu jendela. Setiap JPanel akan memiliki manajer tata letak sendiri. Beberapa orang menolak keras pada tata letak bersarang, karena sulit dipertahankan. Ketika saya menggunakannya, saya memberikan masing-masing metode kreasi sendiri untuk membuatnya lebih mudah untuk melihat apa yang dilakukan masing-masing. Tapi saya tidak pernah "menerapkan" manajer tata letak. Saya hanya instantiate mereka.
Jika jawaban ke 4 adalah "ya", tidakkah ini akan menyebabkan proliferasi kelas LayoutManager yang akan menjadi sulit dipertahankan? Jika Anda menerapkan kelas manajer tata letak baru untuk sedikit variasi dalam tata letak, Anda salah menggunakannya. Jika Anda hanya menerapkan manajer tata letak baru, Anda mungkin melakukan sesuatu yang salah. Satu-satunya saat saya memperpanjang kelas LayoutManager, itu adalah menambahkan slider zoom ke JScrollPane.
Dalam situasi di mana saya perlu menentukan proporsi antara anak-anak dari Komponen (misalnya, child1 harus menggunakan 10% ruang, child2 40%, child3 50%), apakah mungkin untuk mencapai itu tanpa menerapkan LayoutManager kustom? JSplitPane memiliki cara untuk menentukan persentase yang harus didapatkan setiap komponen. Pembagi dapat dipindah secara default, tetapi Anda dapat mematikannya jika mau. Saya tidak banyak menggunakan fitur itu. Saya biasanya memiliki beberapa komponen yang mengambil ukuran yang ditetapkan, dan sisa ruang diambil oleh panel gulir. Ukuran panel gulir akan menyesuaikan dengan ukuran jendela. Jika Anda memiliki dua panel gulir berdampingan, Anda bisa meletakkannya di JSplitPane dan menentukan persentase ruang baru yang diberikan kepada masing-masing sebagai pengguna memperluas dan mengontrak windows.
sumber