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:http://mindprod.com/jgloss/contentpane.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM