閱讀596 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go centos 6.4 minimal 64位 服務器安裝後的一些手段
  下一篇:go MongoDB Replica Set使用幾點總結