| 在過去的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()進行添加
|