“随着 Internet 的飞速发展,Java 技术也得到了越来越广泛的应用。而无论我们是采用 J2SE、J2EE 还是 J2ME,GUI 都是不能回避的问题。现在的应用软件越来越要求界面友好、功能强大而又使用简单。而众所周知,在 Java 中进行 GUI 设计相对于其跨平台、多线程等特性的实现要复杂和麻烦许多。这也是很多 Java 程序员抱怨的事情。但 GUI 已经成为程序发展的方向,所以我们也必须了解 Java 的 GUI 设计方法和特点。其实,采用 Java 提供的布局管理器接口和相应的布局管理类,我们也可以做出相当漂亮的界面来,当然实现起来肯定要比 VB 麻烦许多。”。初学GUI和AWT,不知GUI和AWT现如今现状如何,特意上网搜索一下,摘抄了一段。现在转入正题。
(Graphical User Interface)图形用户界面。AWT(Abstract Window Toolkit)抽象窗口工具集,第一代的 Java GUI 组件,是重量级的。
1.AWT包及其组件:
所有和AWT编程相关的类都放在java.awt包以及它的子包中:
AWT定义了Container,Componet及LayoutManager等;使用LayoutManager;使用Flow(流式,)Border,Grid及Card布局管理器来获得动态布局;使用Frame及panel;
2.容器及布局 :
1).按作用分类:
1.基本组件(构件:按钮,文本框 );
2.容器(容纳其它组件,所有容器都是java.awt.Container的直接或间接子类)。
基本的AWT库处理方法是把这些元素的创建和行为委托给每个目标平台(Windows,Unix,Macintosh)上的本地GUI工具进行处理。实现了跨平台。
2)window和Panel:
Container是Componet的一个子类,包括两个主要子类:window,Panel
1-Window(窗口)是Java.awt.window的一个对象,有两种形式:Frame(框架)和Dialog(对话框),他们都是window的子类。
1].Frame(框架)是一个带有标题、边框和缩放的窗口;是window的子类,从容器继承并以add(方式添加组件。能以字符串的标题创建不可见的框架对象,能将BorderLayout当做缺省布局管理器,能用setLayout方式改变缺省布局管理器。
2].Dialog(对话框)能移动不能缩放。
2- Panel(面板)是Java.awt.panel的对象。Panel包含在另一个容器中,或者是web浏览器的窗口中。Panel确定一个四边形,其组件可以放入其中。Panel必须在window中才能显示出来。Panel可嵌套。容器里组件的位置和大小是由布局管理器决定的;然后要用组建的serLocation()设置位置,setSize()设置大小,或setBounds()设置边框,来定位在容器中多个位置。
3.AWT中提供了5种布局管理器:
1.BorderLayout:windows
2.FlowLayout:planel
3.GridLayout
4.CardLayout
5.GridBagLayout
默认的布局管理器:
1.BorderLayout:
在一个Panel或window中放置一个组件提供一个更复杂的方案。窗口缩放,按钮位置布局不变,大小改变。BorderLayout是Frame类的默认布局管理器;将整个容器布局划分成东西南北中,只能将组建添加到指定区域(默认为center);每个区域只能加入一个组件。
实例:
运行结果:package AWT; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; public class EXGui2 { //Border Layout实例 private Frame frame; private Button bn,bs,bw,be,bc;//设置5个按钮 public void go(){ frame = new Frame("Border Layout"); bn = new Button("B2");//若注释掉本行,b3,b4,b5部分会自动延伸覆盖此位置 bs = new Button("B1"); bw = new Button("B3"); be = new Button("B4"); bc = new Button("B5"); frame.add(bn,BorderLayout.NORTH); //将第一个按钮增加到北边 frame.add(bs,BorderLayout.SOUTH); //将第一个按钮增加到南边 frame.add(bw,BorderLayout.WEST); //将第一个按钮增加到西边 frame.add(be,BorderLayout.EAST); //将第一个按钮增加到东边 frame.add(bc,BorderLayout.CENTER); //将第一个按钮增加到中间 frame.setSize(200,200);//设置窗口大小 frame.setVisible(true);//设置窗口可见 } public static void main(String[] args) { EXGui2 gui = new EXGui2(); gui.go(); } }
2.FlowLayout:
他不限制他所管理的组件的大小,而是允许他们有自己的最佳大小;默认居中存放;
缩放位置布局发生变化;
实例:
运行结果:package AWT; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; public class MyFlow { private Frame frame ; private Button b1,b2 ,b3; public void go(){ frame = new Frame("Flow Layout"); frame.setLayout(new FlowLayout());//使用FlowLayout替换掉默认的BorderLayout布局管理器 b1 = new Button("hello"); b2 = new Button("world"); b3 = new Button("welcome"); frame.add(b1);//将b1添加到对象frame中 frame.add(b2);//将b2添加到对象frame中 frame.add(b3);//将b3添加到对象frame中 frame.setSize(200,200);//设置窗体大小 frame.setVisible(true);//设置窗体可见 } public static void main(String[] args) { MyFlow flow = new MyFlow(); flow.go(); } }
3.GridLayout(网格):
为放置组件提供了灵活性。用行列管理,然后将组件填充到由管理程序规定单元里。它总是忽略组建的最佳大小,所有单元宽度和高度相同,根据单元数对可用宽度和高度进行平分。若缺少元素,则空着。
实例:
运行结果:package AWT; import java.awt.Button; import java.awt.Frame; import java.awt.GridLayout; public class GridEX { private Frame frame; private Button b1,b2,b3,b4,b5,b6; public void go(){ frame = new Frame("Grid Layout"); frame.setLayout(new GridLayout(3,2));//设置3*的网格 b1= new Button("1");//设置button显示 b2= new Button("2"); b3= new Button("3"); b4= new Button("4"); b5= new Button("5"); b6= new Button("6"); frame.add(b1);//把b1添加到frame对象 frame.add(b2); frame.add(b3); frame.add(b4); frame.add(b5); frame.add(b6); frame.pack();//压缩成最小大小 frame.setVisible(true); } public static void main(String[] args) { GridEX grid = new GridEX(); grid.go(); } }
布局管理器 总结:
Frame:顶级窗口,默认BorderLayout布局管理器
Panel:无法单独显示,必须添加到某个容器当中;默认FlowLayout布局管理器;把panel作为组件添加到某个布局管理器中后,panel仍旧可以使用自己的布局管理器。因此,可用BorderLayout添加多个panel组件。
若要自定义组件的大小或者位置,则需要取消该容器的布局管理器:setLayout(null)。
参考资料:
1.文枫 (wenfb@sina.com):Java 图形用户界面设计;
2.googledreamzte的空间:GUI(图形用户界面)和AWT;
3.圣思园张龙老师Java教学视频。