swing視窗與面板的使用

來源:互聯網
上載者:User

閱前聲明: 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();

    }

}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.