1. 程式人生 > >AWT和布局管理器

AWT和布局管理器

log 都沒有 tro 原則 ++ 開發 out pan 背景顏色

  • AWT(Abstract Window Toolkit)抽象窗口開發包

技術分享

  • component:可以顯示出來的與用戶進行交互的圖形元素
  • container:容納其他component元素的容器;continer可以容納component;所以container可以容納container。

  continer對象可以使用add方法添加其他的component對象。

  一般的component不能獨立顯示出來,必須放在某一continer對象中才可以顯示出來

  兩種常用的container:

  1、Windows:自由停泊的頂級窗口

  • Dialog:模態和非模態對話框;
  • Frame:可做獨立窗口顯示出來

  Frame的構造方法:

  Frame()

  Frame(String s)//創建標題欄為字符串的窗口

  setBounds(int x,int y,int width,int height) //設置窗體位置和大小,x,y為左上角坐標(單位為像素);width和height是寬度和高度

  setSize(int width,int height)//設置窗體的大小

  setLocation(int x,int y)//設置窗體的位置

  setBackground(Color c)//設置背景顏色,設置為color對象 cyan青色;magenta洋紅

  setVisible(boolean b)//設置是否可見

  setTitle(String name)   String getTitle()

  setResizeble(boolean b)  //設置是否可以調節大小

  在未定義按鈕的情況下,Ctrl+c

  setLayout()//設置布局  

import java.awt.Color;
import java.awt.Frame;

public class TestMultiFrame {
    public static void main(String args[]) {
        MyFrame f1 = 
            new MyFrame(100,100,200,200,Color.BLUE);
        MyFrame f2 
= new MyFrame(300,100,200,200,Color.YELLOW); MyFrame f3 = new MyFrame(100,300,200,200,Color.GREEN); MyFrame f4 = new MyFrame(300,300,200,200,Color.MAGENTA); } } class MyFrame extends Frame{ static int id = 0; MyFrame(int x,int y,int w,int h,Color color){ super("MyFrame " + (++id)); setBackground(color); setLayout(null); setBounds(x,y,w,h); setVisible(true); } }

運行結果:

  技術分享

  2、Panel:不能自由停泊,不是頂級窗口,必須添加到continer裏面才能顯示出來。

  Panel可以容納其他的component對象(例如:Button),但是不能獨立顯示。

  Panel可以有自己的布局管理器

  Panel是一般容器,可以自身嵌套(比如在panel1裏嵌入panel2);但Frame已經是頂層容器了,自身不能嵌套。

  Panel的構造方法:

  Panel()//使用默認FlowLayout類布局管理器初始化

  Panel(LayoutManager layout)//使用指定的布局管理器初始化

  Panel擁有從父類繼承來的 

  setBounds(int x,int y,int width,int height)

  setSize(int width,int height)

  setLocation(int x,int y)

  setBackground(Color c)

  setLayout(LayoutManager mgr)

import java.awt.*;
public class TestMultiPanel {
    public static void main(String args[]) {
        new MyFrame2("MyFrameWithPanel",300,300,400,300);
    }
}
class MyFrame2 extends Frame{
    private Panel p1,p2,p3,p4;
    MyFrame2(String s,int x,int y,int w,int h){
        super(s);
        setLayout(null);
        p1 = new Panel(null); p2 = new Panel(null);
        p3 = new Panel(null); p4 = new Panel(null);
        p1.setBounds(0,0,w/2,h/2);
        p2.setBounds(0,h/2,w/2,h/2);
        p3.setBounds(w/2,0,w/2,h/2);
        p4.setBounds(w/2,h/2,w/2,h/2);
        p1.setBackground(Color.BLUE);
        p2.setBackground(Color.GREEN);
        p3.setBackground(Color.YELLOW);
        p4.setBackground(Color.MAGENTA);
        add(p1);add(p2);add(p3);add(p4);
        setBounds(x,y,w,h);
        setVisible(true);
    }
}

運行結果:

技術分享

?????是BorderLayout布局管理器?

  為什麽Frame可以獨立顯示而Panel不可以?

  在Window類裏定義了pack()和show()兩個顯示窗口的方法,被Frame繼承了過來。這可能也是panel無法單獨使用的一個原因吧,Panel和它的直接超類Container裏,都沒有定義類似pack()和show()的顯示容器的方法。

  • 布局管理器

  管理component在container中的布局,不必直接設置component的大小和位置

  每個continer都有一個布局管理器對象,當容器需要對某個組件進行定位或判斷其大小尺寸時,就會調用其布局管理器,調用continer的setLayout方法改變其布局管理器對象

  awt提供了5種布局管理器:(實現LayoutManager接口)

  1、FlowLayout

    panel類的默認布局管理器

    逐行定位,行內從左到右,排滿換行,不改變組件大小,按組件原有尺寸顯示組件,可設置不同的組件間距,行距以及對齊方式。

    FlowLayout的默認對齊方式為居中

    setLayout(new FlowLayout())//FlowLayout實現了LayoutManager的接口//父類引用指向子類對象;

    FlowLayout的構造函數:

          new FlowLayout(FlowLayout.RIGHT,20,40);//右對齊,組件之間水平距離20像素,垂直距離40像素;

          new FlowLayout(FlowLayout.LEFT); / /左對齊,水平和垂直距離為缺省值5

          new FlowLayout();//居中對齊,水平和垂直距離為缺省值5(居中對齊為FlowLayout.CENTER)

import java.awt.*;
public class TestFlowLayout2 {
    public static void main(String args[]) {
        Frame f = new Frame("Java Frame");
        FlowLayout l = 
            new FlowLayout(FlowLayout.CENTER, 20, 40);
        f.setLayout(l); 
        f.setLocation(300,400);
        f.setSize(300,200);
        f.setBackground(new Color(204,204,255));
        for(int i = 1; i<=7; i++){
            f.add(new Button("BUTTON"));
        }
        f.setVisible(true);
    }
}

運行結果:

技術分享

 2、BorderLayout

    Frame類的默認管理器

    BorderLayout將整個容器的布局分為:東(EAST)西(WEAST)南(SOUTH)北(NORTH)中(CENTER)五個布局,只能將組件放到指定區域。//為int型

    如不指定組件位置,則將其放入CENTER;

    每個區域只能加入一個組件,如加入多個,則先加入的會被覆蓋。

技術分享

    BorderLayout布局尺寸縮放原則:

          南北兩個區域水平方向縮放

          東西兩個區域垂直方向縮放

          中間可在兩個方向上縮放

import java.awt.*;
public class TestBorderLayout {
    public static void main(String args[]) {
        Frame f;
        f = new Frame("Border Layout");
        Button bn = new Button("BN");
        Button bs = new Button("BS");
        Button bw = new Button("BW");
        Button be = new Button("BE");
        Button bc = new Button("BC");
        
        f.add(bn, "North");
        f.add(bs, "South");
        f.add(bw, "West");
        f.add(be, "East");
        f.add(bc, "Center");
        
        
        // 也可使用下述語句
        /*
        f.add(bn, BorderLayout.NORTH);
        f.add(bs, BorderLayout.SOUTH);
        f.add(bw, BorderLayout.WEST);
        f.add(be, BorderLayout.EAST);
        f.add(bc, BorderLayout.CENTER);
        */
        
        f.setSize(200,200);
        f.setVisible(true);
    }
}

運行結果:

      技術分享

  3、GridLayout

    GridLayout將空間劃分為小格,每個單元格大小相等。組件被填到每個單元格中,從左到右填滿換行,從上到下。

    GridLayout的構造方法:

      例:GridLayout(3,4) //指定行數和列數

import java.awt.*;
public class TestGridLayout {
    public static void main(String args[]) {
        Frame f = new Frame("GridLayout Example");
        Button b1 = new Button("b1");
        Button b2 = new Button("b2");
        Button b3 = new Button("b3");
        Button b4 = new Button("b4");
        Button b5 = new Button("b5");
        Button b6 = new Button("b6");
        f.setLayout (new GridLayout(3,2));
        f.add(b1);        
        f.add(b2);
        f.add(b3);        
        f.add(b4);
        f.add(b5);        
        f.add(b6);
        f.pack();       //包著button,button不改變大小,pack使窗口適應button大小   
        f.setVisible(true);
    }
}

運行結果:

  技術分享

  4、CardLayout

  5、GridBagLayout

綜合:

import java.awt.*;
public class TenButtons {
  public static void main(String args[]) {
      Frame f=new Frame("My Frame");
      f.setLayout(new GridLayout(2,1));
      Panel p1=new Panel();
      Panel p2=new Panel();
      Panel p21=new Panel();
      Panel p22=new Panel();
      p1.setLayout(new BorderLayout());
      p2.setLayout(new BorderLayout());
      p21.setLayout(new GridLayout(2,1));
      p22.setLayout(new GridLayout(2,2));
      p1.add(new Button("Button"), BorderLayout.EAST);
      p1.add(new Button("Button"), BorderLayout.WEST);
      p21.add(new Button("Button"));
      p21.add(new Button("Button"));
      p1.add(p21, BorderLayout.CENTER);
      p2.add(new Button("Button"), BorderLayout.EAST);
      p2.add(new Button("Button"), BorderLayout.WEST);
      for(int i=0;i<4;i++){
          p22.add(new Button("Button"));
      }
      p2.add(p22, BorderLayout.CENTER);
      f.add(p1);
      f.add(p2);
      f.setVisible(true);
      f.pack();
  }
}

運行結果:

    技術分享

AWT和布局管理器