java 界面编程(上)
一、AWT介绍
1)AWT(Abstract windows toolkit) 包括了很多类和接口,用于java Application的GUI(Graphics User Interface图形界面编程)
2)GUI的各种元素(窗口,按钮,文本框)等都由java类来实现
3)使用AWT所涉及的类一般在java.awt包及其子包中。
4)Container和Component是AWT中的两个核心类。
所有的可以显示出来的图形元素都被称为Componnet,Component代表了所有的可见的图形元素,Component里面有一种比较特殊的图形元素叫Container,Container(容器)在图形界面里面是一种可以容纳其他Component元素的一种容器,Container本身也是一种Component,Container里面也可以容纳别的Container。
Container里面又分为Window 和Pannel,Window是可以独立显示出来的,平时我们看到的各种各样的应用程序的窗口都可以成为Window,Window作为一个应用程序窗口独立显示出来,Pannel也可以容纳其他的图形元素,但一般看不见Pannel,Pannel不能作为应用程序的独立窗口显示出来,Pannel要想显示出来就必须得把自己装入window中才能显示出来。
Panne应用比较典型地就是Applet(java的页面小应用程序),现在基本已经不用了Ajax和AVASCRIPT完全取代了它的应用。
Window本身又可以分为Frame和Dialog,Frame就是我们平时看到的一般的窗口,而Dialog则是那些需要用户进行某些操作(如点击某个下拉菜单的项)才出现的对话框,这种对话框就是Dialog 。
二、组件和容器
java的图形界面的基本组成部分是Component,Component类及其子类的对象用来描述以图形化的方式显示在屏幕上并能与用户进行交互的GUI元素,例如,button, lable。
一般的Component对象不能独立地显示出来,必须将“放在”某一的Container对象中,才可以显示出来。
Container是Component子类,Container子类对象可以“容纳” 别的Component对象。
Container对象可以使用方法add()向其中添加其他的Component对象。
Container是Component的子类,因此Container对象也可以被当做Component对象添加到其他Container对象中。
有两种常用的Container:
window: 其对象表示自由停泊的顶级窗口
Pannel: 其对象可作为容纳其他的Component对象,但不能独立存在,必须被添加到其他Container中(如window或Applet)
Frame
Frame是windows的子类,由Frame或其子类创建的对象是一个窗体。
Frame的常用构造方法:
Frame()
Frame(String s) 创建标题栏为s的窗口 (静态的窗口而非某个动作pop出来的窗口 做为对比)
方法
SetBounds(int x,inty,int width,int height);
SetSize(int width,int height);
SetLocation(int x,int y);
SetBackground(Color c)
SetVisible(boolean b)
SetTitle(String name)
String getTitle()
setResizeable(boolean b)
package com.lost.frame; import java.awt.Color; import java.awt.Frame; public class FrameDemo { public static void main(String[] args) { // TODO Auto-generated method stub Frame f1 = new MyFrame(100,100,400,400,Color.BLUE); Frame f2 = new MyFrame(300,100,400,400,Color.YELLOW); Frame f3 = new MyFrame(100,300,400,400,Color.GREEN); Frame f4 = new MyFrame(300,300,400,400,Color.MAGENTA); } } class MyFrame extends Frame { static int id = 0; public MyFrame(int x,int y,int width,int height,Color color) { // TODO Auto-generated constructor stub super("MyFrame"+(++id)); setBackground(color); setBounds(x, y, width, height); setLayout(null); setVisible(true); } }
Pannel
Pannel 对象可以看成容纳Componnet的空间
Pannel 对象可以拥有自己的布局管理器
Pannel 类拥有从其父类继承来的
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)
构造方法
Pannel()
Pannel(LayoutManager layout)
package com.lost.pannel; import java.awt.Color; import java.awt.Frame; import java.awt.Panel; import javax.lang.model.type.NullType; public class PannelDemo { public static void main(String[] args) { // TODO Auto-generated method stub Frame f = new Frame("Java Frame with Pannel"); Panel p = new Panel(); f.setLayout(null); f.setBounds(300, 300, 500, 500); f.setBackground(new Color(0,0,102));//设置背景颜色时使用三基色(红,绿,蓝)的比例来调配背景色 p.setBounds(50,50,400,400);//这里设置的坐标(50,50)是相对于Frame窗体的 p.setBackground(new Color(204,204,255)); f.add(p);//把Panel容器装入到Frame容器中,使其能在Frame窗口中显示出来 f.setVisible(true); } }
三、布局管理器
管理Component在Container中的布局,不必直接设置Component的的位置和大小
每个Container都有一个布局管理对象,弹光荣器需要对讴歌组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器,调用Container的setlayout方法改变其布局管理器对象。
Awt提供了5种布局管理器类:
Flowlayout
Borderlayout
GridLayout
Cardlayout
GridBagLayout
1、第一种布局管理器--------FlowLayout
FlowLayout是Pannel类的默认布局管理器
flowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。
不改变组件的大小,按组件原有尺寸显示组件,可以设置不同的组件间距,行距以及对其方式。
FlowLayout布局管理器默认的对其方式是剧中。
FlowLayout构造方法
new Flowlayout(Flowlayout.RIGHT,20,40)
右对齐,组件之间的水平间距20px,垂直间距40px
new FlowLayout(FlowLayout.LEFT)
左对齐,水平和垂直间距为缺省值5px
new FlowLayout()
默认的居中对齐方式,水平和垂直间距为缺省值5.
package com.lost.FlowLayout; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; public class FlowLayoutDemo { public static void main(String[] args) { // TODO Auto-generated method stub Frame f = new Frame("FlowLayout"); Button btn1 = new Button("btn1"); Button btn2 = new Button("btn2"); Button btn3 = new Button("btn3"); f.setLayout(new FlowLayout()); f.add(btn1); f.add(btn2); f.add(btn3); f.setVisible(true); f.setSize(500, 500); } }
2、Borderlayout
Borderlayout 是Frame类的默认布局管理器
BoderLayout将整个容器分为
东(EAST)西(WEST)南(SOUTH)北(NORTH)中(CENTER)
组件只能被添加到指定的区域。
如不指定组件的加入部位,则默认加入到CENTER区
每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖
Borderlayout布局容器尺寸缩放原则
水平和垂直缩放
package com.lost.Border; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; public class BorderLayoutDemo { public static void main(String[] args) { // TODO Auto-generated method stub Frame f = new Frame("BorderLayout"); Button btn1 = new Button("east"); Button btn2 = new Button("west"); Button btn3 = new Button("north"); Button btn4 = new Button("south"); Button btn5 = new Button("center"); f.setLayout(new BorderLayout()); f.add(btn1,BorderLayout.EAST); f.add(btn2,BorderLayout.WEST); f.add(btn3,BorderLayout.NORTH); f.add(btn4,BorderLayout.SOUTH); f.add(btn5,BorderLayout.CENTER); f.setVisible(true); f.setSize(500, 500); } }
3、GridLayout(表格布局管理器)
Gridlayout布局管理器
GridLayout型布局管理器将空间划分成规则的矩形网络,每个单元格区域大小相等。组件被添加到每个单元格中,先从左到右填满一行后,再从上到下。
在GridLayout构造方法中指定分割的行数和列数
new GridLayout(3,4)
package com.lost.Grid; import java.awt.Button; import java.awt.Frame; import java.awt.GridLayout; public class GridLayoutDemo { public static void main(String[] args) { // TODO Auto-generated method stub Frame f = new Frame("GridLayout"); f.setLayout(new GridLayout(2,3)); Button btn1 = new Button("btn1"); Button btn2 = new Button("btn2"); Button btn3 = new Button("btn3"); Button btn4 = new Button("btn4"); Button btn5 = new Button("btn5"); Button btn6 = new Button("bnt6"); f.add(btn1); f.add(btn2); f.add(btn3); f.add(btn4); f.add(btn5); f.add(btn6); /* * Causes this Window to be sized to fit the preferred size and layouts of its subcomponents. * The resulting width and height of the window are automatically enlarged if either of dimensions * is less than the minimum size as specified by the previous call to the setMinimumSize method. If the window and/or its owner are not displayable yet, both of them are made displayable before calculating the preferred size. The Window is validated after its size is being calculated. 设置到适应尺寸 * */ f.pack(); f.setVisible(true); } }
Frame的嵌套使用小实例
package com.lost.layout; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Panel; public class LayoutCombineDemo { public static void main(String[] args) { // TODO Auto-generated method stub Frame f = new Frame("Layout 嵌套使用"); f.setLayout(new GridLayout(2, 1)); f.setVisible(true); f.setLocation(300, 400); f.setSize(500, 500); f.setBackground(new Color(204,204,255)); Panel p1 = new Panel(new BorderLayout()); Panel p2 = new Panel(new GridLayout(2,1)); Panel p3 = new Panel(new BorderLayout()); Panel p4 = new Panel(new GridLayout(2,2)); p1.add(new Button("East(p1-东)"),BorderLayout.EAST); p1.add(new Button("West(p1-西)"),BorderLayout.WEST); p2.add(new Button("p2-Button1")); p2.add(new Button("p2-Button2")); p1.add(p2,BorderLayout.CENTER);//把p2作为元素加入到p1里面 p3.add(new Button("East(p3-东)"),BorderLayout.EAST); p3.add(new Button("West(p3-西)"),BorderLayout.WEST); for(int i=0;i<4;i++){ p4.add(new Button("p4-Button"+i)); } p3.add(p4,BorderLayout.CENTER); f.add(p1); f.add(p3); } }
四、布局管理器小结
Frame是一个顶级窗口,Frame的缺省布局管理器为Borderlayout
Panel无法单独显示,必须添加到某个容器中。
Panel的缺省布局管理器为Fowlayout
当把Pannel作为一个组件添加到某个容器中后,该Panel任然可以有自己的布局管理器。
使用布局管理器时,布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的大小和位置属性,如果试图使用java语言提供的setLocation setSize setBounds ,都会被布局管理器覆盖。
如果用户确实需要亲自设置组件大小或位置,则应该取消该容器的布局管理器
setlayout(null);