Java AWT编程笔记-基本元素

来源:互联网 发布:迅联食材配送软件 编辑:程序博客网 时间:2024/06/07 07:01



1.AWT 和Swing

AWT是SUN在jdk中提供的基本的GUI类库,被称为Abstract Window Toolkit。AWT是窗口框架,它从不同平台的窗口系统中抽取共同组件,当程序运行时,将这些组件的创建和动作委托给所在的运行平台。也就是说,JVM调用操作系统本地的图形界面来创建和平台一致的对等体。

AWT的不足:

(1)界面丑陋,功能有限

(2)不能使用特定操作系统上复杂的图形界面组件,最多只能使用4种字体;

(3)AWT使用非常笨拙的、非面向对象的编程模式。


Swing是新的Java GUI库,Swing、AWT、辅助功能API、2D API和拖放API共同组成了JFC(Java Foundation Classes)。Swing组件全面代替了Java1.0中的AWT组件,但是使用的仍然是AWT事件模型。


2.AWT组件

所有和AWT变成相关的类,都放在java.awt包及子包中。AWT图形组件大致结构如下:



3.AWT容器

容器Container是Component的一个子类,可以盛装普通的Component。F


Window:可独立存在的顶级窗口;

Panel:可作为容器,但是不能独立存在,必须放在其它容器中。常用组件。

Frame:Window子类,有标题,能通过拖拉改变窗口的位置和大小;初始化不可见,通过setVisible(true),显示;默认使用BorderLayout作为布局管理器(下一节介绍)。很常用。

ScrollPane:带滚动条的容器,不能单独存在。

测试代码:

import java.awt.Button;import java.awt.Frame;import java.awt.Panel;import java.awt.TextField;public class TestFrame {public static void main(String[] args) {Frame f = new Frame("测试窗口");Panel p = new Panel();//添加组件p.add(new TextField());p.add(new Button("单机我"));//添加到Framef.add(p);//frame位置f.setBounds(30,30,250,200);//frame可见f.setVisible(true);}}

效果图:



4.布局管理器Layout

容器里面放组件,但是组件的布局由布局管理器控制,上面的示例代码中没有设置布局,使用默认的布局管理器。

AWT常用布局管理器:

(1)FlowLayout:组件像水流一样向某方向排列,遇到边界就折回。默认方向向左。

import java.awt.Button;import java.awt.FlowLayout;import java.awt.Frame;public class TestFlowLayout {public static void main(String[] args) {Frame f = new Frame("FlowLayout");//设置FlowLayout,左对齐f.setLayout(new FlowLayout(FlowLayout.LEFT));//添加10个按钮for(int i=0;i<10;i++){f.add(new Button("button" + i));}f.setBounds(30, 30, 300, 200);f.setVisible(true);}}


(2)BorderLayout:将容器分为EAST、SOUTH、WEST、NORTH和CENTER五个区域,组件可以被放置在其中的任意一个。

import java.awt.BorderLayout;import java.awt.Button;import java.awt.Frame;public class TestBorderLayout {public static void main(String[] args) {Frame f = new Frame("Border");//设置BorderLayout,水平间距30,垂直间距20f.setLayout(new BorderLayout(30,20));f.add(new Button("南"), BorderLayout.SOUTH);f.add(new Button("北"), BorderLayout.NORTH);f.add(new Button("东"), BorderLayout.EAST);f.add(new Button("西"), BorderLayout.WEST);f.add(new Button("中"), BorderLayout.CENTER);f.add(new Button("中2"), BorderLayout.CENTER);f.pack();f.setVisible(true);}}

效果图:


重复添加位置,后一个会覆盖前面,5个位置不用全部添加,BorderLayout会自动调整。

(3)GridLayout:将容器分割为纵横线分割的网格,每个网格一样大。

这个好理解。


(4)GridBagLayout:功能最强大,也是最复杂的布局管理器,与GridLayout不同的是:GridBagLayout中的组件可以跨越多个网格,并可以设置各个网格大小不同。

为了控制容器中的组件大小和跨越性,java提供了GridBagConstraints。

示例代码:

package se.example.awt;import java.awt.Button;import java.awt.Frame;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;public class TestGridBag {private Frame f = new Frame("测试窗口");private GridBagLayout gb = new GridBagLayout();private GridBagConstraints gbc = new GridBagConstraints();private Button[] bs = new Button[10];public void init(){f.setLayout(gb);for (int i = 0; i < bs.length ; i++ ){bs[i] = new Button("按钮" + i);}//所有组件都可以横向、纵向上扩大        gbc.fill = GridBagConstraints.BOTH;        gbc.weightx = 1;        addButton(bs[0]);        addButton(bs[1]);        addButton(bs[2]);//该GridBagConstraints控制的GUI组件将会成为横向最后一个元素gbc.gridwidth = GridBagConstraints.REMAINDER;        addButton(bs[3]);//该GridBagConstraints控制的GUI组件将横向上不会扩大        gbc.weightx = 0;        addButton(bs[4]);//该GridBagConstraints控制的GUI组件将横跨2个网格gbc.gridwidth = 2;        addButton(bs[5]);//该GridBagConstraints控制的GUI组件将横跨1个网格gbc.gridwidth = 1;//该GridBagConstraints控制的GUI组件将纵向跨2个网格gbc.gridheight = 2;//该GridBagConstraints控制的GUI组件将会成为横向最后一个元素gbc.gridwidth = GridBagConstraints.REMAINDER;        addButton(bs[6]);//该GridBagConstraints控制的GUI组件将横向跨越一个网格,纵向跨越2个网格。gbc.gridwidth = 1;gbc.gridheight = 2;//该GridBagConstraints控制的GUI组件纵向扩大的权重是1        gbc.weighty = 1;        addButton(bs[7]);//设置下面的按钮在纵向上不会扩大        gbc.weighty = 0;//该GridBagConstraints控制的GUI组件将会成为横向最后一个元素gbc.gridwidth = GridBagConstraints.REMAINDER;//该GridBagConstraints控制的GUI组件将纵向上横跨1个网格gbc.gridheight = 1;        addButton(bs[8]);        addButton(bs[9]);f.pack();f.setVisible(true);}    private void addButton(Button button) {        gb.setConstraints(button, gbc);        f.add(button);    }public static void main(String[] args) {TestGridBag tgb = new TestGridBag();tgb.init();}}

效果图:



(5)CardLayout:以时间而非空间来管理它的组件,将加入容器的所有组件看做一叠卡片,每次只有上面的那个组件才可见。并提供方法控制显示的组件。

CardLayout的常用方法:first(Container c);last(Container c);previous(Container c);next(Container c);show(Container c ,String name)。


(6)BoxLayout:Swing引入的一个新的布局管理器。保留了GridBagLayout的许多优点,却更简单。可以在垂直和水平方向上摆放组件。

package se.example.awt;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Frame;import javax.swing.Box;public class TestBoxLayout {private Frame f = new Frame("测试");//定义水平摆放组件的Box对象private Box horizontal = Box.createHorizontalBox();//定义垂直摆放组件的Box对象private Box vertical = Box.createVerticalBox();public void init(){horizontal.add(new Button("水平按钮一"));horizontal.add(Box.createHorizontalGlue());horizontal.add(new Button("水平按钮二"));//水平方向不可拉伸的间距,其宽度为10pxhorizontal.add(Box.createHorizontalStrut(10));horizontal.add(new Button("水平按钮三"));vertical.add(new Button("垂直按钮一"));vertical.add(Box.createVerticalGlue());vertical.add(new Button("垂直按钮二"));//垂直方向不可拉伸的间距,其高度为10pxvertical.add(Box.createVerticalStrut(10));vertical.add(new Button("垂直按钮三"));f.add(horizontal , BorderLayout.NORTH);f.add(vertical);f.pack();f.setVisible(true);}public static void main(String[] args) {new TestBoxLayout().init();}}

效果图:






原创粉丝点击