物件導向程式設計

 

 

第六章、設計Java Applet

 

 


授課教師:陳慶瀚

WWW : http://www.miat.ee.isu.edu.tw/java

E-mail : pierre@isu.edu.tw   

 

 
 

6.6版面管理員:LayoutManager

當我們將一個元件加到Applet(或是任何Container)上, 該Applet會使用它的layout manager 決定要將元件放置的位置。

java.awt.LayoutManager是一個界面元件. 下列5個版面配置物件類別都安裝(繼承)這個界面元件:

  • FlowLayout
  • BorderLayout
  • CardLayout
  • GridLayout
  • GridBagLayout

FlowLayout是最基本的版面配置元件,Applet和Panel內定的版面配置就是FlowLayout。它將元件由左到右依序(依加入的先後順序)排列,單行放不下的元件會移到下一行。

BorderLayout可將元件放置在Applet的North, South, East, West和Center等五個位置。

CardLayout將一個Applet是為一組重疊的版面,每個版面擁有自己的LayoutManager,但一次只能顯示一個版面。

GridLayout的元件擺置方式是將 Applet切割成grids table,每一個grid都具有相同的寬度和高度。元件由左到右、由上到下依序(依加入的先後順序)排列。

GridBagLayout類似GridLayout,但多出兩項功能:

1. 每一個grid可以擁有自己的寬度和高度。

2. 元件擺放的位置可以由設計者指定,而不一定依鍵入先後順序由左到右、由上到下排列。

 

FlowLayout版面

 

使用範例:
FlowLayout fl;
fl = new FlowLayout();

FlowLayout fl = new FlowLayout();

在Applet程式中,直接將FlowLayout元件傳入Applet的成員函式setLayout()中:

this.setLayout(fl);

最精簡的寫法:

this.setLayout(new FlowLayout());

FlowLayout的切齊功能

    this.setLayout(new FlowLayout(FlowLayout.LEFT));   //向左切齊
    this.setLayout(new FlowLayout(FlowLayout.RIGHT));  //向右切齊
    this.setLayout(new FlowLayout(FlowLayout.CENTER)); //中間切齊
 


中間切齊範例

設定元件在FlowLayout上彼此間的間隔  

public FlowLayout(int alignment, int hspace, int vspace);

例:

FlowLayout fl =  new FlowLayout(FlowLayout.LEFT, 20, 10);//單位:pixel


 


範例6.6.1:

 

 
import java.applet.*;    
import java.awt.*;
 
public class SpaceTapeDeck extends Applet 
{
  public void init() 
  {
    this.setLayout( new FlowLayout(FlowLayout.LEFT, 20, 10));
    this.add( new Button("Play"));
    this.add( new Button("Rewind"));
    this.add( new Button("Fast Forward"));
    this.add( new Button("Pause"));
    this.add( new Button("Stop"));  
  }
}
 
結果瀏覽:

 


BorderLayout

BorderLayout可將元件放置在Applet的North, South, East, West和Center等五個位置。

BorderLayout的使用模式如同FlowLayout,如

this.setLayout(new BorderLayout());
BorderLayout沒有切齊的功能,但可以設定水平和垂直間隔,如
this.setLayout(new BorderLayout(5, 10));

將元件加入 BorderLayout的特定位置 如下:

this.add("South", new Button("Start"));

 


範例6.6.2:

import java.applet.*;    
import java.awt.*;

public class BorderLayout1 extends Applet
{
  public void init()
  {
    setLayout( new BorderLayout(10, 5));
    add("South", new Button("南1"));
    add("South", new Button("南2"));
    add("North", new Button("北"));
    add("East", new Button("東"));
    add("West", new Button("西"));  
  }
}

結果瀏覽:

 


CardLayout

CardLayout將一個Applet是為一組重疊的版面,每個版面擁有自己的LayoutManager,但一次只能顯示一個版面。

CardLayouts使用模式

 
    this.setLayout(new CardLayout());//建構一個CardLayout並植入Applet

    this.setLayout(new CardLayout(3, 4));//設定水平和垂直的間隙寬度

每一個card都有一個名稱.當一個GUI元件被加(使用add成員函式)到一個新的card名稱,此一card會自動產生 。如下例將產生3個card:

this.setLayout(new CardLayout());
this.add("Pizza", new Label("How do you like your pizza?"));
this.add("Pizza", new Button("OK"));
this.add("Payment", new Label("How would you like to pay?"));
this.add("Payment", new Button("OK"));
this.add("Address", new Label("Delivery Instructions"));
this.add("Address", new Button("Order"));

下例則產生5個card :

this.setLayout(new CardLayout());
this.add("1", new Label("First Card"));
this.add("2", new Label("Second Card"));
this.add("3", new Label("Third Card"));
this.add("4", new Label("Fourth Card"));
this.add("5", new Label("Fifth Card"));
this.add("6", new Label("Sixth Card"));

切換不同的Card

 public void first(Container parent)
 public void next(Container parent)
 public void previous(Container parent)
 public void last(Container parent)
 public void show(Container parent, String name)

 


範例6.6.3:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;   
public class CardLayoutApplet extends Applet implements ActionListener
{
        Panel myPanel;
        Button myButton[]= new Button[5];
        CardLayout Card=new CardLayout();
        public void init()
        {
                myPanel = new Panel();
                myPanel.setLayout(Card);
                this.add(myPanel);
                for (int i=0;i<5;i++)
                {
                        myButton[i] = new Button("這是第" + String.valueOf(i)+"層版面");
                        myPanel.add(String.valueOf(i), myButton[i]);
                        myButton[i].addActionListener(this);            
                }               
        }
        public void actionPerformed(ActionEvent theEv)
        {
        if (theEv.getSource()==myButton[0]||theEv.getSource()==myButton[1]
               ||theEv.getSource()==myButton[2]||theEv.getSource()==myButton[3]
           ||theEv.getSource()==myButton[4])
                {
            Card.next(myPanel);
                }
        }
}

結果瀏覽:

 


GridLayout

GridLayout的元件擺置方式是將 Applet切割成grids table,每一個grid都具有相同的寬度和高度。元件由左到右、由上到下依序(依加入的先後順序)排列。

 


範例6.6.4:

 

import java.awt.*;
import java.applet.*;
public class GridLayoutApplet extends Applet
{
    Panel myPanel;
    Button myButton[]= new Button[9];
 
        public void init()
        {
        myPanel = new Panel();
        myPanel.setLayout(new GridLayout(3,3,5,5));
        this.add(myPanel);
        for (int i=0;i<9;i++)
        {
            myButton[i] = new Button("GridLayout "+ String.valueOf(i));
            myPanel.add(myButton[i]);
        }               
        }
}

 


GridBagLayout

GridBagLayout類似GridLayout,但多出兩項功能:

1. 每一個grid可以擁有自己的寬度和高度。

2. 元件擺放的位置可以由設計者指定,而不一定依鍵入先後順序由左到右、由上到下排列。


 

物件導向程式設計

義守大學電機系 陳慶瀚

2001.11.15