Javax.swing中JFrame.getContentPane().add(pane)與JFrame.add(pane)有何區別?
區別如下: 當你創建一個JFrame的時候JFrame jf = new JFrame(); 在構造方法JFrame()內部會給jf默認添加一個rootPane 所以執行完JFrame jf = new JFrame();這句話之後jf上麵已經添加了一個默認的rootpanel了 然後你再調用jf.add(panel) 這個時候,panel和rootPane是平級的 理由:1,你可以讀源代碼 ,查看構造方法怎麼寫的 2,或者你可以測試一下,分別執行 jf.setBackground(Color.blue); jf.getContentPane().setBackground(Color.black); 這兩句代碼,看看效果(實際上上麵一句並不能改變界麵的背景色,下麵一句才可以,因為rootPane把jf給擋住了,上麵一句是改變了jf的背景色,但是你眼睛看到的並不是jf,其實是rootPane.) 另外 jf.getContentPane()==jf.getRootPane().getContentPane() 上麵的比較返回的true 所以你調用jf.getContentPane().add(panel) 其實是把panel添加到rootPane上麵了,這個時候panel和rootPane就不是平級的了 /** * Called by the constructor methods to create the default * <code>rootPane</code>. */ protected JRootPane createRootPane() { JRootPane rp = new JRootPane(); // NOTE: this uses setOpaque vs LookAndFeel.installProperty as there // is NO reason for the RootPane not to be opaque. For painting to // work the contentPane must be opaque, therefor the RootPane can // also be opaque. rp.setOpaque(true); return rp; } 以上黃色部分是JFrame類的源代碼片段!
示例:
在過去的J2SE版本中,部件(components)不能直接添加到最高級(top level)的Swing容器,這些容器包括:JFrame, JDialog, JWindow, JApplet和JInternalFrame. 例如現在有一個JFrame的instance命名為aFrame。 我們要添加一個命名為aComponent的部件(比如一個JPanel)到JFrame裏。以往我們需要調用JFrame的getContentPane()辦法。如下:
aFrame.getContentPane().add(aComponent)
在J2SE5.0中,我們可以直接添加部件到最高級的Swing容器,也可以直接在容器內設置布局管理(Layout Manager)和刪除部件。這個變化允許我們可以省去調用getContentPane()而直接在容器內應用add(),setLayout()和remove()。然而,我們還是不能忽略了ContentPane,即使我們可能將不會再使用ContentPane來添加部件到容器。 先看一個我們以往在J2SE1.4及其以前的版本經常應用到的例子。我們要設置一個JFrame的布局管理而且添加一些部件到該JFrame。查看api關於JFrame的文件可以發現,
JFrame從java.awt.Container繼承了add()辦法. 該add()是用來添加一個部件到JFrame容器. Container類裏也包含setLayout()辦法, 該setLayout()是用來設置繼承者(比如上麵的JFrame容器)的布局管理。
下麵是一個簡單的例子:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.GridLayout;
import java.awt.Color;
public class FrameTest extends JFrame {
//注意在1.4及其以前版本中可以編譯,但是運行有問題
//5.0版本運行正常
FrameTest(){
super("Test");
setBackground(Color.BLACK);
setLayout(new GridLayout(6,6,2,2)); // 1.4中問題 1
for ( int i=0;i<36; i++){
JPanel jPanel = new JPanel();
jPanel.setBackground(new Color (
(int)(Math.random()*16777215)));
add(jPanel); // 1.4中問題 2
}
setSize(400,400);
setVisible(true);
}
public static void main(String[] args){
new FrameTest();
}
}
運行效果1如下:
這時我們注意到上麵輸出的JFrame的背景顏色並不是黑色而是白色, 也就是說上麵的setBackground(Color.BLACK)編譯後該JFrame的背景顏色並沒有被顯示,如果要讓JFrame背景顏色為黑色--grid之間顏色為黑色還需要調用getContentPane(),
getContentPane().setBackground(Color.BLACK);
運行效果2如下:
From:https://mindprod.com/jgloss/contentpane.html
最後更新:2017-04-03 14:54:23
上一篇:
centos 6.4 minimal 64位 服務器安裝後的一些手段
下一篇:
MongoDB Replica Set使用幾點總結
BNEF:東非大陽能光伏項目發展前景
剖析url中漢字對網站優化結果的影響
Java並發包中的同步隊列SynchronousQueue實現原理
magento -- 給後台分類管理頁的分類商品加一欄商品類型
遠程登錄:ftp
android sdk 編譯--如何將源代碼加入android.jar,以及make原理 1
jlink燒寫Nor Flash時出錯正確解決方法匯總:PC of target system has unexpected value after programming
The Linux Kernel Module Programming Guide
如何把ResultSet轉換成Java對象
Android中利用LinearLayout繼承實現ImageButton