Java: Perbedaan antara metode setPreferredSize () dan setSize () dalam komponen

105

Apa perbedaan utama antara setSize()dan setPreferredSize(). Terkadang saya menggunakan setSize(), terkadangsetPreferredSize() , terkadang yang satu melakukan apa yang saya inginkan, terkadang yang lain.

Panggilan apa yang harus saya gunakan untuk JFrames dan JPanels?

David Robles
sumber

Jawaban:

116

Penggunaannya bergantung pada apakah induk komponen memiliki pengelola tata letak atau tidak.

  • setSize() - digunakan jika pengelola tata letak induk tidak ada;
  • setPreferredSize()(juga yang terkait setMinimumSizedan setMaximumSize) - gunakan jika ada pengelola tata letak induk.

The setSize()Metode mungkin tidak akan melakukan apa-apa jika orang tua komponen menggunakan manajer layout; tempat ini biasanya akan memiliki efek akan pada komponen tingkat atas ( JFrames dan JWindows) dan hal-hal yang di dalam panel menggulir. Anda juga harus memanggil setSize()jika Anda memiliki komponen di dalam induk tanpa pengelola tata letak.

Umumnya, setPreferredSize()akan menata komponen seperti yang diharapkan jika ada pengelola tata letak; sebagian besar pengelola tata letak bekerja dengan mendapatkan ukuran yang diinginkan (serta minimum dan maksimum) komponennya, kemudian menggunakan setSize()dan setLocation()memposisikan komponen tersebut sesuai dengan aturan tata letak.

Misalnya, a BorderLayoutmencoba untuk membuat batas wilayah "utara" sama dengan ukuran yang diinginkan dari komponen utaranya --- mereka mungkin berakhir lebih besar atau lebih kecil dari itu, tergantung pada ukuran JFrame, ukuran komponen lainnya dalam tata letak, dan sebagainya.

Sbodd
sumber
1
Saya pikir sebuah komponen menggunakan pengelola tata letak secara default (BorderLayout?), Jadi jika saya tidak secara eksplisit menyetel pengelola tata letak, apakah itu berarti saya harus menggunakan setSize () daripada setPreferredSize ()?
David Robles
3
Saya percaya JPanels menggunakan BorderLayout secara default, tetapi JComponent tidak memiliki tata letak default. Sering kali, Anda lebih baik menyetel pengelola tata letak jika Anda akan menambahkan sesuatu daripada menggunakan setSize ().
Sbodd
8
Rekomendasi saya adalah selalu menggunakan manajer tata letak. SetSize () harus dianggap sebagai sesuatu yang dipanggil oleh pengelola tata letak - bukan sesuatu yang Anda panggil.
Kevin Day
8
@Sbodd - JPanels memiliki FlowLayout secara default. JFrame.getContentPane () memiliki BorderLayout secara default.
Nemi
10

setSize()atau setBounds()dapat digunakan saat tidak ada pengelola tata letak yang digunakan.

Namun, jika Anda menggunakan pengelola tata letak, Anda dapat memberikan petunjuk kepada pengelola tata letak menggunakan setXXXSize()metode seperti setPreferredSize()dan setMinimumSize()lain - lain.

Dan pastikan bahwa penampung komponen menggunakan pengelola tata letak yang sesuai dengan ukuran yang diminta. The FlowLayout, GridBagLayout, danSpringLayout manajer menggunakan ukuran yang diinginkan komponen (dua yang terakhir tergantung pada kendala Anda mengatur), tapi BorderLayoutdan GridLayoutbiasanya don't.If Anda menentukan petunjuk ukuran baru untuk komponen yang sudah terlihat, Anda perlu memanggil metode validasi ulang pada itu untuk memastikan bahwa hierarki penahanannya ditata kembali. Kemudian aktifkan metode pengecatan ulang.

Varun
sumber
5

setSize akan mengubah ukuran komponen ke ukuran yang ditentukan.

setPreferredSizemengatur ukuran yang diinginkan. Komponen sebenarnya mungkin tidak berukuran ini tergantung pada ukuran wadahnya, atau jika pengguna mengubah ukuran komponen secara manual.

Lembah kecil
sumber
Bisakah Anda menunjukkan contoh lengkap setPreferredSize (...). Saya pikir ini akan membantu.
Doug Hauf
4

IIRC ...

setSize mengatur ukuran komponen.

setPreferredSizemengatur ukuran yang diinginkan. Layoutmanager akan mencoba mengatur sebanyak itu ruang untuk komponen Anda.

Itu tergantung pada apakah Anda menggunakan pengelola tata letak atau tidak ...

miku
sumber
dan bagaimana jika saya menambahkan dua jpanels ke jframe tanpa menentukan manajer tata letak secara eksplisit untuk jframe? metode apa yang harus saya gunakan untuk mengatur ukuran jpanels?
David Robles
3
Panel konten menggunakan BorderLayout secara default ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). Jadi contentpane JFrame memiliki LayoutManager, jadi setPreferredSize harus berfungsi ..
miku
Kedengarannya bagus, itu berarti saya harus menggunakan setSize untuk JFrame dan setPreferredSize untuk komponen di dalamnya
David Robles
1
Biasanya Anda akan menggunakan frame.pack () untuk memanfaatkan ukuran pilihan yang dihitung dari semua komponen anak. Jika tidak, jika Anda hanya menggunakan frame.setSize () secara acak, maka komponen yang ditambahkan ke panel konten akan meluas / menyusut agar sesuai dengan ruang yang tersedia, yang berarti ukuran yang diinginkan dari setiap komponen dapat diganti.
camickr