2012-02-07 23 views
8
Ben as of Java 1.5, tek böyle bir JFrame bir bileşen eklemek olabilir, biliyoruz

eklemek için getContentPane() gerektiren vermedi:Neden JFrame aslen bileşenleri

myFrame.add (myButton); yerine

:

myFrame.getContentPane() ekleyin (myButton.);

Neden bu her zaman böyle değildi? ContentPane bir bileşen eklemek:

JFrame API dile üzere
+0

soran Benim nedenini ben giriş CS ve öğretiyorum olduğunu Kitaptaki örneklerin tümü eski notasyonu kullanır.Ekstra bir adım atmak için neden bir kez gerekli olduğunu öğrencilere bir türlü verebilmeyi isterdim. –

cevap

9

, her ikisi de aynı şeyi yapın. Bu Salıncak Eğer JFrame (veya başka Salıncak üst düzey konteyner) üzerinde doğrudan bu arama yapmak için izin sözdizimsel şeker/kolaylık yöntemi eklendi sadece son zamanlarda (belki? Java 1.5), ama yine de ContentPane eklemeler yapıyoruz. Eğer myJFrame.setBackground(Color.green); aracılığıyla JFrame arka plan rengini ayarlamak için denemek ve hiçbir şey olmuyorsa remove(...) ve setLayout(...) için aynı Bunların hepsi çok netleşiyor. Bu sebepten dolayı, bu değişimden çok mutlu değilim. Bu ve ayrıca eski bir curmudgeon olması gerektiğinden.

+0

Değişiklikten neden mutsuz olduğunuzu söyleyebilir misiniz? Buna karşı argümanı anlamaya çalışıyorum. –

+3

Konsept, yeni başlayanları JFrame'in aslında bileşeni aldığına inanmaya yönlendiriyor. ** Yine ** JFrame'de setBackground (...) öğesini çağırmayı deneyin. –

+0

Teşekkürler. Neden JFrame'i ilk etapta kapsayıcı yapmıyorsunuz, bu yüzden setBackground() insanlar ne bekliyor? –

7

4753342: Swing üst düzey bileşeni eklemek/yönlendirme ContentPane için yöntemleri kaldırmalısınız

Açıklama:
, AWT programlamaya

aksine JFrame/JDialg/JWindow/JApplet/JInternalFrame yok Eğer buna Component s eklemek yerine yaklaşık JRootPane öğrenmeli ve çocukları eklemek izin Component s buna. Bu yeni geliştiricilere gereksiz karmaşa ekler. eklemek veya Component ler istisna neden olacaktır bu en üst düzey birinden Component kaldırmaya çalışmadan

önce 5.0'a, atılacak. 5.0 ile istisna yerine Component ilave veya içerik bölmesinden kaldırılır, atılmış olacaktır. Bu, JFrame, JDialog, JWindow, JApplet ve JInternalFrame javadokuna ilişkin birkaç revizyonla sonuçlandı. Bu RootPaneContainer en javadoc özetlenmiş bulunmaktadır:

* For conveniance 
* <code>JFrame</code>, <code>JDialog</code>, <code>JWindow</code>, 
* <code>JApplet</code> and <code>JInternalFrame</code>, by default, 
* forward all calls to <code>add</code> and its variants, 
* <code>remove</code> and <code>setLayout</code> to the 
* <code>contentPane</code>. This means rather than writing: 
* <pre> 
* rootPaneContainer.getContentPane().add(component); 
* </pre> 
* you can do: 
* <pre> 
* rootPaneContainer.add(component); 
* </pre> 
* <p> 
* The behavior of <code>add</code> and its variants and 
* <code>setLayout</code> for 
* <code>JFrame</code>, <code>JDialog</code>, <code>JWindow</code>, 
* <code>JApplet</code> and <code>JInternalFrame</code> is controlled by 
* the <code>rootPaneCheckingEnabled</code> property. If this property is 
* true, the default, then <code>add</code> and its variants and 
* <code>setLayout</code> are 
* forwarded to the <code>contentPane</code>, if it is false, then these 
* methods operate directly on the <code>RootPaneContainer</code>. This 
* property is only intended for subclasses, and is therefor protected. 
Ayrıca

, burada ilgili böcek:

+0

Çok yararlı bilgi! 1+ –

+0

Çok yardımcı, teşekkürler. – Alanmars