Swing中的getContentPane()方法

來源:互聯網
上載者:User

http://www.java3z.com/cwbwebhome/article/article2/2359.html

 

  在過去的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();     }   }                        

輸出入下:

     這時我們注意到上面輸出的JFrame的背景顏色並不是黑色而是白色, 也就是說上面的setBackground(Color.BLACK)編譯後
該JFrame的背景顏色並沒有被顯示, 如果要讓JFrame背景顏色為黑色--grid之間顏色為黑色還需要調用getContentPane(),

getContentPane().setBackground(Color.BLACK);
如下面輸出:

 

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");// this.setBackground(Color.BLACK);getContentPane().setBackground(Color.BLACK);setLayout(new GridLayout(6, 6, 2, 2)); // 1.4中問題 1getContentPane().setLayout(new GridLayout(6, 6, 2, 2)); // 1.4中問題 1for (int i = 0; i < 36; i++) {JPanel jPanel = new JPanel();jPanel.setBackground(new Color((int) (Math.random() * 16777215)));// add(jPanel); // 1.4中問題 2getContentPane().add(jPanel);}setSize(400, 400);setVisible(true);}public static void main(String[] args) {new FrameTest();}}

下面的這個程式也會很好解釋現象

import java.awt.Container;import java.awt.FlowLayout;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;/* FlowLayout()建立一個新的Flow Layout,此FlowLayout預設值是置中對齊,組件彼此有5單位的水平與垂直間距。  FlowLayout(int align)建立一個新的Flow Layout,此FlowLayout可設定相片順序,組件彼此有5單位的水平與垂直 間距。  FlowLayout(int align,int hgap,int vgap)建立一個新的Flow Layout,此FlowLayout可設定相片順序與組件間距。  */public class FlowLayoutDemo {public FlowLayoutDemo() {JFrame f = new JFrame();/* * 你可以使用有間距的FlowLayout建構函式,使FlowLayout的排列具有間距,並 * 並可利用排列方向參數來指定靠什麼方向排列,FlowLayout共有五種相片順序, * 依次是CENTER(預設值),LEFT,RIGHT,LEADING,TRAILING,若我們將下面程式第13 * 行改成contentPane.setLayout(new FlowLayout(FlowLayout.LEFT)); *//* * Container contentPane=f.getContentPane(); contentPane.setLayout(new * FlowLayout()); contentPane.add(new JButton("first")); * contentPane.add(new JButton("second")); contentPane.add(new * JButton("third")); contentPane.add(new JButton("fourth")); * contentPane.add(new JButton("fifth")); contentPane.add(new * JButton("Last")); */Container contentPane = f.getContentPane();contentPane.setLayout(new FlowLayout());// setLayout(new FlowLayout());JPanel jPanel = new JPanel();jPanel.add(new JButton("first"));// f.add(new JButton("first"));f.add(new JButton("second"));f.add(new JButton("third"));f.add(new JButton("fourth"));f.add(new JButton("fifth"));f.add(new JButton("Last"));f.setTitle("FlowLayout");// f.pack();//必須將f.pach()去掉,否則setSize功能將沒有作用f.setSize(400, 220);f.setVisible(true);f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});}private void setLayout(FlowLayout flowLayout) {// TODO Auto-generated method stub}public static void main(String[] args) {FlowLayoutDemo b = new FlowLayoutDemo();}}

 

發現在javaSE1.4之中不能直接在JFrame當中直接使用.setLayout .setBackground   .add(JPanel)  方法 需要使用Container   contentPane = f.getContentPane();方法獲得Container對象  然後contentPane使用上述方法,亦可直接使用getContentPane()進行添加

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.