閱前聲明: http://blog.csdn.net/heimaoxiaozi/archive/2007/01/19/1487884.aspx
4-1-1:JFrame的使用:
類階層圖:
java.lang.Object
--java.awt.Component
--java.awt.Container
--java.awt.Window
--javax.swing.JFrame
結構函數:
JFram()
JFrame(String title)
例子:JFrame1.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JFrame1 implements ActionListener{
public JFrame1(){
JFrame f=new JFrame("JFrameDemo");
/*我們要在JFrame中加入其他組件必須取得Content Pane,然後再加入組件到此Content Pane中。
*相對於AWT,若要在AWT中的Frmae加入某一個組件只要直接調用add()方法即可,不需要先取得
*Content Pane再加入組件。Swing這樣的做法似乎多了一道手續,卻帶來更強大、更有彈性的
*功能,原因就在於Swing的JFrame具有層次(Layer)的概念,可以讓你在JFrame中放入的組件不
*會造成混亂。例如當一個JFrame有按鈕(JButton)、菜單(JMenu)、快速菜單(Pop-up menu)、
*工具列(Toolbar)與工具列符號提示(Tool tip)時,到底哪個組件應該擺在什麼組件上面或
*下面,JFrame都有辦法處理。以後我們再討論這個問題。
*/
Container contentPane=f.getContentPane();
JButton b=new JButton("Click me to get new Window");
b.addActionListener(this);
contentPane.add(b);
f.pack();
f.show();//使JFrame變成可看見的(Visible)
f.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
public void actionPerformed(ActionEvent e){
JFrame newf=new JFrame();//產生一個沒有標題的JFrame
newf.setSize(200,200);
newf.show();
}
public static void main(String[] args){
new JFrame1();
}
}
4-1-2:Swing的容器結構與JLayeredPane的使用:
類階層圖:
java.lang.Object
--java.awt.Compontent
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JLayeredPane
我們可把Swing容器的結構看似如所示:
|Grass Pane
|
Root Pane|
| |Content Pane
|Layered Pane|
|Menu Bar
其中,Root Pane可以看成是虛擬容器,包含著Grass Pane、Layered Pane、Content Pane與Menu Bar.Swing的容器包括JApplet
,JFrame,JDialog,JWindow與JInternalFrame都是構造在此結構上,JApplet、JFrame、JDialog、JWindow都是heavyweight容器,只
有JInternalFrame是lightweight容器。當我們要加入某個組件到Swing的容器中時,並不是直接加入到Root Pane,而是加入到
RootPane下面的某一成員(Layered Pane或Content Pane)
Content Pane與Menu Bar只是Layered Pane的其中一層,我們稱此層為Frame-Content Layer.若你想知道Frame-Content Layer
在Layered Pane的層次是什嗎?你可以由JLayeredPane類中的Frame_Content_layer類常數取得。
由此我們可以知道,Layered Pane基本上可擁有非常多的“層”(Layer),那麼如何分辨哪一層是在哪一層的上面或下面呢?
答案是Z_order.Z_order本身具有兩個整數值,一個是代表層(Layer)的深度,另一個代表同層的相關位置(Position),當Z_order
的Layer數值越小時,表示其位置就在越底層,當Z_order的Layer數值越大時,表示其位置就在越上層。在JLayeredPane類中,共定
義了6個Z_order常數供使用者參考,如下所示:
DEFAULT_LAYER:Z_order的Layer數值為0,以整數對象Integer(0)來表示,一般我們加入的組件若沒有標記是第幾層,預設值就
把組件放在此Default Layer中。
PALETTE_LAYER:Z_order的Layer數值為100,以整數對象Integer(100)來表示,位於Default Layer之上,一般用於放置可移動的
工具列(Floatable Toolbar).
MODAL_LAYER:Z_order的Layer數值為200,以整數對象Integer(200)來表示,位於PALETTE_LAYER之上,一般用於放置對話方塊
(Dialog Box).
POPUP_LAYER:Z_order的Layer數值為300,以整數對象Integer(300)來表示,位於MODAL_LAYER之上,一般用於捷徑功能表(Poup
Menu)與工具列提示(Tool Tips)中.
DRAG_LAYER:Z_order的Layer數值為400,以整數對象Integer(400)來表示,位於POPUP_LAYER之上,一般用於拖曳組件使其在不同
地區上.
FRAME_CONTENT_LAYER:Z_order的Layer數值為-30000,以整數對象Integer(-30000)來表示,一般來說,Frame Content Layer
最底層的是Layer,用來表示Content Pane與Menu Bar的位置,大部份情況我們不會更改到這個數值。
一般程式會提供良好的Z-order自動管理機制,當然java也不例外,因此大部份情況我們不會使用到Z-order,因為系統會自動
幫我們管理得好好的。使用者只需將所需的組件直接加入Content Pane即可,不需要知道它們之間的循序關聯性。但如果今天您必須處
理對象之間的層次關係時,例如Word中你可以把某個繪圖對象下推至下一層,你就必須親自處理Z-order的關係了。
下面我們來看如何利用JLayeredPane來控制對象的層次關係:
這個例子分別用7個JLabel對象層層相疊,每個JLabel對象都有不同的Z-order數值,形成7層相疊的效果!
JLayeredPane1.java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JLayeredPane1 extends JFrame{
public JLayeredPane1(){
super("JLayeredPane");
/*由小到大定義組件深度數值,也就是Z-order layer的大小。
*/
Integer[] layerConstants={
JLayeredPane.DEFAULT_LAYER,JLayeredPane.PALETTE_LAYER,
new Integer(101),JLayeredPane.MODAL_LAYER,new Integer(201),
JLayeredPane.POPUP_LAYER,JLayeredPane.DRAG_LAYER
};
/*定義每個JLabel的顏色
*/
Color[] colors={
Color.red,Color.blue,Color.magenta,Color.cyan,Color.yellow,
Color.green,Color.pink
};
Point position=new Point(10,10);
JLabel[] label=new JLabel[7];
JLayeredPane layeredPane=getLayeredPane();//取得視窗的Layered Pane
for(int i=0;i<7;i++){
label[i]=createLabel("第"+(i+1)+"層",colors[i],position);
position.x=position.x+20;
position.y=position.y+20;
//將組件(JLabel)放入Layered Pane中並給予深度(Z-order layer)的數值。
layeredPane.add(label[i],layerConstants[i]);
}
setSize(new Dimension(280,280));
show();
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
public JLabel createLabel(String content,Color color,Point position){
JLabel label=new JLabel(content,JLabel.CENTER);
label.setVerticalAlignment(JLabel.TOP);
label.setBackground(color);
label.setForeground(Color.black);
label.setOpaque(true);
label.setBounds(position.x,position.y,100,100);
return label;
}
public static void main(String[] args){
new JLayeredPane1();
}
}
從上面的例子可以看出,雖然“Button1”的層次比“按鈕一”低,但它卻顯示在“按鈕一”之上,原因"按鈕一"是加在
Content Pane中而不是加在LayeredPane上,因此顯示時以Content Pane與加在Content Pane上的組件來做層次的比較。
從面的例子可以看出,Z-order layer數值越小的組件在越底層,也就會被Z-order layer值較大的組件所覆蓋。那如果兩個
組件都在同一層且相互重疊,怎麼知道它們之間的層次關係呢?答案是利用Z-order的另外一個整數值:position。position
數值的關係跟 Z-order的layer數值恰好相反,在同一層中的對象,若position數值越小者則在越上層,position數值越大者則
在越下層。position的數值是從-1~n~1,n是指在同一層中組件的個數,數值-1代表最底層,意思跟n-1一樣;數值0代表最上層。
你可以使用JLayeredPane類提供的moveToBack()方法將組件推至position為-1(最底端)的位置,或是使用moveToFront()方法
將組件推至position為0(最頂端)的位置。我們來看下面的範例:JLayeredPane3.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JLayeredPane3 extends JFrame{
public JLayeredPane3(){
super("JLayeredPane");
JLabel label1=new JLabel("左Label",JLabel.CENTER);
label1.setVerticalAlignment(JLabel.TOP);
label1.setBackground(Color.red);
label1.setForeground(Color.black);
label1.setOpaque(true);
label1.setBounds(20,20,150,150);
JLabel label2=new JLabel("右sLabe2",JLabel.CENTER);
label2.setVerticalAlignment(JLabel.TOP);
label2.setBackground(Color.red);
label2.setForeground(Color.black);
label2.setOpaque(true);
label2.setBounds(50,50,150,150);
JLayeredPane layeredPane=getLayeredPane();
layeredPane.add(label1,new Integer(10),1);
layeredPane.add(label2,new Integer(10),0);
setSize(new Dimension(280,280));
show();
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
public static void main(String[] args){
new JLayeredPane3();
}
}