Java: Bileşenlerdeki setPreferredSize () ve setSize () yöntemleri arasındaki fark


Yanıtlar:


116

Kullanım, bileşenin üst öğesinin bir yerleşim yöneticisine sahip olup olmamasına bağlıdır.

  • setSize() - bir ana yerleşim yöneticisi olmadığında kullanın;
  • setPreferredSize()(ayrıca ilişkili setMinimumSizeve setMaximumSize) - bir üst düzen yöneticisi mevcut olduğunda kullanın.

setSize()Bileşenin ebeveyn Bir düzen yöneticisi kullanarak eğer yöntem muhtemelen hiçbir şey yapmayacağım; yerlerde bu genellikle üst düzey bileşenler (olurdu bir etki yaratacaktır JFrameler ve JWindowlar) ve iç kaydırılan camlardan olan şeyler. setSize()Düzen yöneticisi olmayan bir üst öğe içinde bileşenleriniz varsa da aramanız gerekir .

Genel olarak, setPreferredSize()bir yerleşim yöneticisi mevcutsa bileşenleri beklendiği gibi düzenler; Çoğu yerleşim yöneticisi, bileşenlerinin tercih edilen (minimum ve maksimum) boyutlarını elde ederek setSize()ve ardından setLocation()bu bileşenleri kullanarak ve düzen kurallarına göre konumlandırarak çalışır.

Örneğin, bir BorderLayout"kuzey" bölgesinin sınırlarını kuzey bileşeninin tercih edilen boyutuna eşit yapmaya çalışır - bunlar JFrame, diğer bileşenlerin boyutuna bağlı olarak bundan daha büyük veya daha küçük olabilir. düzende vb.


1
Bir bileşenin varsayılan olarak bir düzen yöneticisi kullandığını düşünmüştüm (BorderLayout?), Bu yüzden açıkça bir düzen yöneticisi ayarlamazsam bu, setPreferredSize () yerine setSize () kullanmam gerektiği anlamına mı gelir?
David Robles

3
JPanels'ın varsayılan olarak BorderLayout kullandığına inanıyorum, ancak JComponent'in varsayılan bir düzeni yok. Çoğu zaman, setSize () kullanmak yerine bir şeyler ekleyecekseniz, bir düzen yöneticisi belirlemeniz daha iyi olur.
Sbodd

8
Benim tavsiyem her zaman bir yerleşim yöneticisi kullanmaktır. SetSize (), düzen yöneticisinin çağırdığı bir şey olarak düşünülmelidir - sizin aradığınız bir şey değil.
Kevin Day

8
@Sbodd - JPanel'lerin varsayılan olarak bir FlowLayout'u vardır. JFrame.getContentPane () varsayılan olarak bir BorderLayout'a sahiptir.
Nemi

10

setSize()veya setBounds()hiçbir yerleşim yöneticisi kullanılmadığında kullanılabilir.

Eğer bir düzen yöneticisi kullanıyorsanız Ancak, kullanarak düzen yöneticisine ipuçları sağlayabilir setXXXSize()gibi yöntemler setPreferredSize()ve setMinimumSize()vb

Bileşenin kapsayıcısının istenen boyuta uyan bir düzen yöneticisi kullandığından emin olun. FlowLayout, GridBagLayoutVe SpringLayoutyöneticiler bileşenin tercih boyutunu (kısıtlamalar ayarladığınız bağlı ikincisi iki) ama kullanmak BorderLayoutve GridLayout, üzerinde revalidate yöntemini çağırmak gerekir Genellikle siz don't.If zaten görünür olan bir bileşen için yeni boyutu ipuçlarını belirtmek kapsama hiyerarşisinin yeniden düzenlenmesini sağlamak için. Ardından yeniden boyama yöntemini çağırın.


5

setSize bileşeni belirtilen boyuta yeniden boyutlandıracaktır.

setPreferredSizetercih edilen boyutu ayarlar. Bileşen, içinde bulunduğu kabın boyutuna veya kullanıcının bileşeni manuel olarak yeniden boyutlandırıp boyutlandırmadığına bağlı olarak aslında bu boyutta olmayabilir.


SetPreferredSize (...) 'nin tam bir örneğini gösterebilir misiniz? Bunun yardımcı olacağını düşünüyorum.
Doug Hauf

4

IIRC ...

setSize bileşenin boyutunu ayarlar.

setPreferredSizetercih edilen boyutu ayarlar. Layoutmanager, bileşeniniz için bu kadar alanı düzenlemeye çalışacaktır.

Bir yerleşim yöneticisi kullanıp kullanmamanıza bağlıdır ...


ve jframe için açıkça bir düzen yöneticisi belirtmeden bir jframe'e iki jpanel eklersem ne olur? jpanellerin boyutunu ayarlamak için hangi yöntemi kullanmalıyım?
David Robles

3
İçerik bölmeleri varsayılan olarak BorderLayout'u kullanır ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). JFrame en ContentPane bir LayoutManager vardır Yani, setPreferredSize böylece gerektiğini .. çalışmak
miku

Kulağa hoş geliyor, bu da JFrame için setSize ve içindeki bileşenler için setPreferredSize kullanmam gerektiği anlamına geliyor
David Robles

1
Tüm alt bileşenlerin hesaplanan tercih edilen boyutundan yararlanmak için genellikle frame.pack () kullanırsınız. Aksi takdirde, frame.setSize () öğesini rasgele kullanırsanız, içerik bölmesine eklenen bileşenler kullanılabilir alana sığacak şekilde genişler / daralır, bu da her bileşenin tercih edilen boyutunun geçersiz kılınabileceği anlamına gelir.
camickr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.