丁保国的博客

收集整理工作生活,点点滴滴

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::

第十六讲常用布局管理器

 

主要内容

 

布局管理器的作用

FlowLayout类顺序排放组件

BorderLayout边界版面布局

GridLayout网格版面布局

用面板JPanel进行界面的分块布局

 

布局管理器概述

布局管理意义

Java中,组件在界面上的布局由布局管理器来管理。

如:

Container cc=getContentPane();

cc.setLayout(new FlowLayout());

cc.add(…);

由此可见,容器的操作处理上将界面设计分成两个步骤:

²       通过setLayout方法将布局的管理交给专门的布局管理器类来完成。

²       通过add方法将将其他组件加入其中

 

每个容器都有一个缺省的布局管理器,用来实现布局管理。

Container的缺省管理器是BorderLayout

 

布局管理器

 

 

由此可知:

²       最顶级的布局管理器是LayoutManager

²       以上列出的布局管理类都实现了该接口

²       布局管理器接口和实现接口的类都在java.awt软件包中

 

FlowLayout顺序排放组件

FlowLayout类概述

根据显示区域的大小,把组件按照从左到右的顺序放置,如果一行放不下,那么就转下一行。

构造方法

public FlowLayout()

public FlowLayout(int align)

public FlowLayout(int align,int hgap,int vgap)

align:排放方式,常用的有:

FlowLayout.CENTER:中心对齐(默认)

FlowLayout.LEFT:左对齐

FlowLayout.RIGHT:右对齐

 

FlowLayout布局示例

import java.awt.*;

import javax.swing.*;

 

class FlowTest extends JFrame {

  FlowTest() {

     super("FlowLayout");

     setDefaultCloseOperation(EXIT_ON_CLOSE);

     Container cc = getContentPane();

     cc.setLayout(new FlowLayout());

     cc.add(new JButton("Button 1"));

     cc.add(new JButton("2"));

     cc.add(new JButton("Button 3"));

     cc.add(new JButton("Long-Named Button 4"));

     cc.add(new JButton("Button 5"));

     pack();

     setVisible(true);

  }

 

  public static void main(String args[]) {

     new   FlowTest();

  }

}

运行结果

 

  

练习:试一试带不同对齐方式参数的FlowLayout布局。(结果为后两个图示)

特点

²改变窗口的大小,那么组件的排列方式也会跟着变化

²组件的顺序和组件的尺寸是确定的,不随窗口而改变

 

边界版面布局BorderLayout

BorderLayout类概述

这是Container对象默认的布局方式且全部居中

构造方法

public BorderLayout()

public BorderLayout(int hgap,int vgap)

说明:此时需在add方法中加上确定边界位置的参数,不加参数组件会叠加在一起。

如:add(new JButton(“North”) , BorderLayout.NORTH);

 

常用的静态成员变量

NORTH:北边

SOUTH:南边

EAST:东边

WEST:西边

CENTER:居中

NORTH

 

WEST    CENTER   EAST

 

SOUTH

 

BorderLayout布局示例

2:改写上面程序,将五个按钮安排成边界布局。(BorderTest.java

 

 

 

特点

²改变窗口的大小,组件的排列方式保持不变

²组件的大小会随窗口而改变

²NORTHSOUTH有确定的高度,WESTEAST有确定的宽度

练习:试一试带间隔参数的BorderLayout布局。

GridLayout网格版面布局

GridLayout类概述

布局方式

把组件放置在类似表格的矩形网格中。

预先需设定网络的行数和列数。

 

构造方法

public GridLayout()

创建单行布局网格

public GridLayout(int rows, int cols)

创建指定行列的布局网格

如果给定行列数较大,网格数多于按钮数,会自动进行列调整

public GridLayout(int rows, int cols,int hgap,int vgap)

创建指定行列,并指定行列间距的布局网格(行数、列数、行间距、列间距)

 

GridLayout布局示例

3:改写程序FlowTest.java,将五个按钮安排成网格布局。(GridTest.java

试一试在组件之间加上行间距和列间距。

*

 

特点

²改变窗口的大小,组件的排列方式保持不变,组件之间的行列间距保持不变

²所有组件的宽度和高度相同,组件的大小会随窗口的尺寸而相应改变

 

用面板JPanel进行界面的分块布局

JPanel概述

 

面板的作用

面板也是一个容器,可容放一组相关的组件。

 

 

不同的面板可采用不同的布局方式,这样有利于窗口的总体布局。

 

面板的构造方法:

public JPanel()创建一个FlowLayout布局的面板

public JPanel(LayoutManger layout)创建一个指定布局的面板

如:JPanel p1=new JPanel(new BorderLayout());

说明:面板的默认布局是FlowLayout,不同于Container的默认。

 

一个简单的面板示例

 

 

import java.awt.*;

import javax.swing.*;

 

class JPanelTest extends JFrame{

  JButton cl,sa,ex;

  JPanel p1,p2;

  JTextArea t;

  public JPanelTest() {

     super("面板示例");

     this.setDefaultCloseOperation(EXIT_ON_CLOSE);

     testInit();

     Container cc=getContentPane();

     cc.setLayout(new FlowLayout());

     cc.add(p1);

     cc.add(p2);

     this.setSize(350,150);

     this.setVisible(true);

  }

  void testInit(){

     cl = new JButton("Clear");

      sa = new JButton("Save");

      ex = new JButton("Exit"); 

      t=new JTextArea(5,20);

      t.setLineWrap(true);

      p1=new  JPanel(new GridLayout(3,1,5,5));

      p2=new  JPanel();

     p1.add(cl); p1.add(sa);p1.add(ex);

     p2.add(new JScrollPane(t));

  }

  public  static voidmain(String[] args) {

     new   JPanelTest();

  }

}

练习:修改以上程序,使得程序运行界面如下图:(下图文本框为6*30

 

 

 

界面布局的分析和设计

一、对如下图示窗口,分析其布局情况

 

 

界面布局设计分析:

²       界面组成

²       面板在包容器中的布局情况

²       各面板的布局情况

 

二、计算器窗口界面设计(不考虑事件)

 

界面布局设计分析:

²       界面组成

²       面板在包容器中的布局情况

²       各面板的布局情况

 

附程序清单:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

class MyButtons {

  String[] keys={"7","8","9","/","4","5","6",

     "*","1","2","3","-","0",".","=","+","Clear"};

  JButton[] keyb = new JButton[keys.length];

  MyButtons(JTextField t){

     for( int i = 0;  i <   keys.length; i++ ) {

        keyb[i]=new JButton(keys[i]);

     }   

  }

}

 

class Calculator extends JFrame {

  JTextField t;

  MyButtons keyButton;

  JPanel p;

  public Calculator() {

     super("Java计算器");

      setDefaultCloseOperation(EXIT_ON_CLOSE );

      calInit();

     Container cc = getContentPane();

     cc.setLayout( new BorderLayout() );

     cc.add(t, "North" );

     cc.add(p, "Center" );

     cc.add(keyButton.keyb[keyButton.keyb.length-1], "South" );

     this.setLocation(300,200);

     this.pack();

     this.setResizable(false);

     this.setVisible(true);

  }

 

  void calInit(){

     t=new JTextField("0.0");

     t.setEditable(false);

     t.setHorizontalAlignment(JTextField.RIGHT);

     keyButton=new MyButtons(t);

     p = new JPanel();

     p.setLayout(new  GridLayout(4,4,4,4));

     for( int i = 0;i<keyButton.keyb.length-1; i++ ){

        p.add(keyButton.keyb[i]);

     }   

  }

 

  public static void main( String[] args ) {

     new Calculator();

  }

}

 

*绝对定位

定义组件的在当前屏幕(窗口)中的位置。两个步骤:

²       放置组件的容器布局设为空:

容器面板.setLayout(null);

 

²       setBounds方法设定各组件的位置和尺寸

组件名.setBounds(x,y,width,height)

 

import java.awt.*;

import javax.swing.*;

 

class TestSetBounds extends JFrame {

  JButton red= new JButton("red");

    JButton green = new JButton("green");

    JButton blue = new JButton("blue");   

    JTextArea t=new JTextArea("try",4,15);

    public TestSetBounds() {

      super("绝对定位示例");

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        Container c=getContentPane();

        c.setLayout(null);

        this.setBounds(400,300,300,200);

        red.setBounds(30,25,80,25);

        green.setBounds(30,75,80,25);

        blue.setBounds(30,125,80,25);

        t.setLineWrap(true);

        JScrollPane s=new JScrollPane(t);

        s.setBounds(150,25,100,125);

        c.add(red);

        c.add(green);

        c.add(blue);

        c.add(s);

        this.setVisible(true);

      }

     public static void main(String[] args) {

        new TestSetBounds();

        }

}

特点:

²       可指定组件确定的显示位置和尺寸,不随窗口的大小而变化

²       不需要用到布局管理器类,但需预先进行组件排版

²       适用于固定尺寸的窗口布局

 

posted on 2007-07-21 10:53  丁保国  阅读(1114)  评论(0编辑  收藏  举报