GUI概述
全称:Graphical User Interface图形用户界面
java为GUI提供的对象都存在Awt,Swing两个包中。
java 关于图形用户界面开发提供两套API也就是AWT和Swing。
AWT
Abstract Window Toolkit抽象窗口工具包)(组件称为重量组件(调用系统函数来画)
Awt是早期版本依赖本地平台,具有平台相关性,如颜色样式显示。
已经慢慢退出历史舞台
Swing
组件称为轻量组件(java代码画),大部分都是轻量级,消耗太多的内存,这样Swing不适于一些小设备。默认的eclipse没有提供swing包,安装WindowBuilder插件提供swing程序开发
Swing是跨平台的,采用mvc设计模式,纯java实现
大多数java图形用户界面开发指的就是Swing开发。
Swing的大部分组件类的类名都是以J字母开头,主要是为了与AWT的老组件相区别。
为什么 AWT 组件没有消亡呢?
因为 Swing 是架构在 AWT 之上的,没有 AWT 就没有 Swing。
SWT
为了彻底解决AWT和Swing框架带来的问题,IBM创建了一个新的GUI库,这就是SWT。SWT是一个开源的GUI编程框架,与AWT/Swing有相似的用处,著名的开源IDE-eclipse就是用SWT开发的。SWT本身仅仅是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API。但是SWT无论是在性能和外观上,都超越了SUN公司提供的AWT和Swing。目前SWT已经十分稳定。
AWT详解
AWT所涉及的类一般在java.awt包及其子包中
主要包括下述三个概念:
1).组件(Component)-
--按钮、标签、菜单等组件的抽象基本类
2).容器(Container)
---Component子类,用add(…)方法向其中添加其他Component。
包括两类:
- 窗口Window(可以独立存在)
- 窗口类又分为框架Frame和对话框
- 面板Panel(必须放在其他容器内).
3).布局管理器(LayoutManager)
---定义容器中组件摆放位置和大小
接口.AWT 中的五种布局管理器,
- FlowLayout(流式布局管理器):从左到右的顺序排列。
- BorderLayout(边界布局管理器):东,南,西,北,中;
- GridLayout(网格布局管理器):规则的矩阵;
- CardLayout(卡片布局管理器):选项卡;
- GridBagLayout(网格包布局管理器):非规则的矩阵
窗体(Frame,Dialog)的默认布局为 BorderLayout(边界布局管理器)。
面板()的默认布局管理器是 FlowLayout 布局管理器。
FlowLayout
构造方法有以下3个:
new FlowLayout(FlowLayout.RIGHT,20,40);//右对齐,组件之间水平距离20个像素,垂直间距40个像素
new FlowLayout(FlowLayout.LEFT);//左对齐,水平和垂直间距为5个像素
new FlowLayout();//使用缺省的居中对齐方式,上下左右均间距5个像素
BorderLayout
如不指定组件的加入部位,则默认添加到center区。
每个区域只能加入一个组件,如果加入多个,则先前加入的会被覆盖掉
BorderLayout布局管理器的尺寸缩放原则
北南两个区在水平方向上缩放
东西两个区在垂直方向上缩放
中部可以在两个方向上缩放
add("West", new JButton("西"))
GridLayout布局管理器
GridLayout型布局管理器将空间划分成规则的举行网格,给个单元格区域大小相等,组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。
在GridLayout构造方法中指定分割的行数和列数,如GridLayout(3,4)
4).Graphics(图形类)
——组件内与图形处理相关的类.包括一些基本图形
所有的GUI对象都会运行在单独的线程上面,awt中的的所有类运行在awt线程
组件与容器
容器是组件的子类,是一个特殊的组件。
组件里面不可以存放组件,而容器可以。
Frame和JFrame(框架):
Frame 是Window类的子类,是带有标题和边框的顶层窗口。窗体的默认布局为 BorderLayout(边界布局管理器)。
JFrame 类是AWT Frame 类的一个子类。它还加入了一些 Swing 所独有的特性。与 Frame 的使用十分相似。唯一的区别在于,你不能将组件加入到JFrame中。你可以将组件加入到 JFrame 的contentpane(内容面板) 中,或者提供一个新的contentpane(内容面板)。
Panel和JPanel(面板):
Panel 是最简单的容器类。不能独立存在,必须依赖其他容器才能显示,可放置其他组件,甚至其他面板,自然就可设置布局管理器,其默认布局管理器是 FlowLayout (流式布局管理器)。
Panel
1.Panel对象可以看成可以容纳Component的空间
2.Panel对象可以拥有自己的布局管理器
3.Panel类拥有从父类继承下来的以下方法:
setBounds(int x, int y, int width, int height);
setSzie(int width, int height);
setLocation(int x, int y);
setBackground(Color c);
setLayout(Layoutmanager mgr);
add(l,"West")不用写布局,这样l组件添加到Panel西边
4.Panel的构造方法为:
Panel();//使用默认的FlowLayout类布局管理器初始化
Panel(LayoutManager layout);//使用指定的布局管理器
简单的窗体创建过程:
Frame f = new Frame(“my window”);//建窗体,引号内填标题栏内容也可以:Frame f = new Frame(); f.setTitle("my window");
f.setDefaultCloseOperation(Frame.EXIT_ON_CLOSE);//关闭窗体时退出程序。不写不退。
f.setLayout(new FlowLayout());//设置布局
f.setSize(300,400);//设置长宽,单位是像素
f.setLocation(300,400);//定义组件在父级(这里是屏幕)相对左上角的坐标
或用setBounds(int x,int y,int width,int height);设置逐渐位置和大小
Button btn = new Button("ok");//定义一个内容为ok的按钮
f.add(btn);//在窗体中加入按钮
f.setLayout(new FlowLaysout());//设为流动布局
f.setBackground( Color.blue);//设置背景颜色
或f.setBackground(new Color(0,0,102));
f.setResizable(false);//设置是否可以改变窗口大小
f.setVisible(true);//设置窗体可见,要写在所有组件后面,要不后面的不显示,而且会阻塞使下面代码得不到执行
常用方法
getWindow()获得当前窗体对象返回为Frame类型,
dispose()释放资源(用setVisible和dispose方法结合起来完成关闭窗体)父类中有dispose方法不用强转对象类型如:Window win =e.getWindow(); win.dispose();
getComponent()获得事件的始发者,返回Component类型,要强转如:Component com = e.getComponent(); Window win=(Window) com; win.dispose();
getSource()获得事件源返回Object类型,也要强转成Window
getParent()获得父级,返回Container类型
关闭窗体事件定义
private void handleEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(windowEvent e){
f.dispose();}});
System.exit(0)是退出主程序
Color
颜色的确定,有以下两种方式:
²1通过Color类的静态常量来确定,如Color.red、Color.white等; ²2 通过new运算符生成颜色对象,Color类的构造方法是:
public Color(int red, int green, int blue) 三个参数均为0时为黑色,均为255时为白色。
事件处理机制
事件:用户对组件的一个操作,称之为一个事件
事件源:引发事件的组件就是事件源
事件处理器:某个Java类中负责处理事件的成员方法
所有事件处理器返回值都是void
事件分类
按产生事件的物理操作和GUI组件的表现效果进行分类:
MouseEvent 鼠标事件
WindowEvent 窗口事件
ActionEvent 动作事件
……
按事件的性质分类:
低级事件
语义事件(又叫做高级事件)
事件监听机制
事件源:发生事件的组件对象
事件:具体发生的事件
监听器:监听器需要注册到具体的对象上,用于监听该对象上发生的事件
事件处理:针对某一动作的具体处理办法
事件监听机制
确定事件源(容器或组件)
通过事件源对象的addXXXListener(new XXXListener())方法将侦听器注册到该事件源上。对象要实现所有方法
该方法中接收XXXListener的子类对象,或者XXXListener的对应的适配器XXXAdapter的子类对象。如:text.addMouseListener(new MouseAdapter() {实现要的方法})
ActionListener没有相关Adapter方法,内部只有actionPerformed(ActionEvent e)方法要实现
一般用匿名内部类来实现。
在覆盖方法的时候,方法的形参一般是XXXEvent类型的变量。
事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。如:e.getComponent().getParent()得到触发事件的组件所在的窗口)
常用事件
KeyEvent用keyPressed和getKeyCode方法及用常量字段
菜单
MenuBar(菜单栏),Menu(菜单),MenuItem(菜单项)
先创建菜单条,再创建菜单,每一个菜单中建立菜单项。
通过Frame对象的setMenuBar()方法,将菜单栏添加到Frame中。
Menu类
add(MenuItem item) 向菜单中添加菜单项item
add(String s) 向菜单中添加指定名称的选项
addSeparator() 添加菜单分隔线
getItem(int n) 获得指定索引n处的选项
getItemCount() 获得菜单选项数目
insert(MenuItem item,int n)
在指定位置n插入菜单项item
insert(String s,int n)
在指定位置n插入名成为s的菜单项
remove(int n) 删除n位置的菜单选项
removeAll() 删除菜单所有选项
MenuItem类
MenuItem()
MenuItem(String s)
构造标题为s的菜单项
setEnable(boolean b)
设置当前菜单项是否可被选择
getLabel()
得到在菜单项上显示的字符串
CheckboxMenuItem item=new CheckboxMenuItem(“新建”);创建复选菜单项
文本框
java.awt包中的TextField类创建文本框如:TextField text =new TextField();
TextField类常用方法:
1构造方法
TextField()文本框长度为一个字符长
TextField(String s)文本框处事字符串为s
TextField(int x)文本框长度为x个字符长
TextField(String s,int x)初始字符串为s,长为x。
2一般方法
setText(String s)文本框中设置文本为s
getText()获取文本框中的文本
setEchoChar(Char a)设置文本框的回显字符,一般输入密码password时用
setEditable(boolean b)指定文本框的可编辑性默认为可编辑true
addActionListener(ActionListener)添加监听器
文本区
TextArea text = new TextArea();
常用方法
1构造方法
TextArea()文本区的列数和行数默认值
TextArea(String s,int x,int y)文本区文本s,x行,y列
TextArea(String s)初始字符串s。
TextArea(String text, int rows, int columns, int scrollbars)构造一个新文本区,该文本区具有指定的文本,以及指定的行数、列数和滚动条可见性。
2一般方法
setText(String s)设置文本,会清除原文本
getText()获取文本
insert(String s,int x)指定位置x列插入指定内容s
replaceRange(String s,int x,int y)用文本s替换x到y位置文本
append(String s)在文本末尾追加文本s
标签
Label l=new Label();
方法
Label():建立空白标签
Label(String s):建立文本为s的标签
setText(String s)为标签设置文本
getText()取得标签的文本
setBackground(Color c)为标签设置背景色
setForeground(Color c)为标签设置前景色(文字颜色)
按钮
Button b=new Button();
方法
Button() 按钮对象无文字标题
Button(String s) 按钮上显示的文字标题为字符串s中的内容
setLabel(String s) 设置按钮上显示的文字
getLabel() 获取按钮上显示的文字
setSize(int width,int height) 设置按钮大小(关闭页面设置setLayout(null))
选择框
Checkbox box=new Checkbox();
方法
CheckBox()
CheckBox(String s) // 标题为s
CheckBox(String s,boolean b) //标题为s,状态为b
CheckBox(String s,boolean b,CheckboxGroup g)//标题为s,状态为b,选择框组为g
setLabel() //设置选择框标题
getLabel() //获取选择框标题
setState(boolean b) //设置选择框状态
getState(boolean b) //获取选择框状态
下拉列表框
Choice choice=new Choice();
Choice() 构造方法,构造下拉列表框
Add(String s) 向下拉列表中增加一个选项
getSelectedIndex() 返回当前选项的索引
getSelectedItem() 返回当前选项的字符串
insert(String s,int n) 将字符串插入下拉列表中的指定位置
remove(int n) 从下拉列表中删除指定的选项
removeAll()删除全部
滚动列表框
List list=new List();
List()
List(int n) 可见行数为n
List(int n,boolean b) 可见行数为n,b为是否允许多项选择
Add(String s) 向滚动列表中增加一个选项,选项标题为s
Add(String s,int n) 向滚动列表的给定位置n增加一个选项
getSelectedIndex() 返回当前选项的索引
getSelectedItem() 返回当前选项的字符串
remove(int n) 删除指定的选项
removeAll() 删除全部选项
Dialog类
Dialog(Frame f,String s) 构造一个有标题为s的初始不可见的对话框,f为指定在那个窗口打开
Dialog(Frame f,String s,boolean b) 构造一个是否有模式的对话框,b为true有模式,b为false无模式,默认为false
getTitle() 获取对话框标题
setTitle(String s) 设置对话框标题
setModal(boolean b) 设置对话框模式
setSize(int a,int b) 设置对话框的大小
setVisible(boolean b) 显示或隐藏对话框
FileDialog
extends Dialog
FileDialog 类显示出一个对话框窗口,用户可以从中选择文件。
FileDialog(Frame)
创建一个读取文件的文件对话框。
FileDialog(Frame, String)
以指定的标题创建一个读取文件的文件对话框窗口。
FileDialog(Frame, String, int)
以指定的标题创建一个读取或保存文件的文件对话框窗口。int为FileDialog.LOAD表示读取,FileDialog.SAVE表示保存
addNotify() 创建文件对话框的同级件。
getDirectory() 获取该文件对话框的目录。
getFile() 获取该文件对话框所选中的文件名。
getFilenameFilter() 确定该文件对话框的文件名过滤器。
getMode() 表示该文件对话框是用于读取文件或是用于保存文件。
paramString() 返回表示该文件对话框窗口的状态的参数字符串。
setDirectory(String) 将该文件对话框窗口的目录设置为指定的目录。
setFile(String) 将该文件对话框窗口的选定文件设置为指定的文件。
setFilenameFilter(FilenameFilter) 将该文件对话框窗口的文件名过滤器设置为指定的过滤器。
setMode(int) 设置文件对话框的模式。
Swing中常用的容器
JFrame 窗口 JPanel 面板 JTabbedPane 标签面板
常用组件
1) JLabel 标签
2)JTextField 文本输入框
3)JPasswordField 密码框
4)JCheckBox 多选框
5)JRadiobutton 单选框
6)JButton 提交按钮
7)JComboBox 下拉框
8)JTable 表格
9)JScrollPane 可滚面板