AWT和Swing
java.awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件
javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现,增强了移植性,属轻量级控件
AWT
在java.awt包中提供了两种基类来表示图形界面元素:Component和MenuComponent,Component代表一个能以图形化方式显示出来,并可与用户交互的对象,而MenuComponent则代表了图形界面的菜单组件
Component
组件的共性方法,设置大小,位置和可见性等
Method:
setLocation(int x, int y) //设置组件位置
setSize(int width, int height) //设置组件大小
setBounds(int x, int y, int width, int height) //同时设置组件的位置,大小
setVisible(Boolean b) //设置该组件的可见性
AWT容器
容器(Container)是Component的子类,容器对象本身也是一个组件,可以使用Component的所有方法,除此之外,容器还具有盛装其他组件的功能
Method:
Component add(Component comp) //向容器中添加其他组件(该组件可以是普通组件或容器),返回被添加的组件
Component getComponentAt(int x, int y) //返回指定点的组件
int getComponentCount() //返回该容器内组件的数量
Component[] getComponent() //返回该容器内的所有组件
AWT主要提供了两种容器类型
Window:可独立存在的顶级窗口
Panel:可作为容器容纳其他组件,不能独立存在,必须被添加到其他容器中(如Window、Panel、Applet)
Frame代表常见的窗口,它是Window类的子类,具有如下特征
Frame对象有标题,允许通过拖拉来改变窗口位置、大小
初始化时为不可见,使用setVisible(true)使其显示出来
默认使用BorderLayout作为布局管理器
Panel是AWT中另一个典型的容器,有如下几个特点
可作为容器来盛装其他组件,为放置组件提供空间
不能单独存在,必须放置到其他容器中
默认使用FlowLayout作为布局管理器
ScrollPane是一个带滚动条的容器,也可能独立存在
可作为容器盛装其他容器,当组件占用空间过大时,会自动产生滚动条,特定构造器可以指定默认具有滚动条
不能单独存在,必须放置到其他容器中
默认使用BorderLayou作为布局管理器
布局管理器
所有AWT容器都有默认的布局管理器,调用容器对象的setLayouManager(LayoutManager lm)方法来指定布局管理器
AWT提供了FlowLayou、BorderLayout、GridLayout、GridBigLayout、CardLayout五个常用的布局管理器,Swing还提供了一个BoxLayout布局管理器
FlowLayout布局管理器
在FlowLayout布局管理器中,组件像水流一样向某方向流动(排列),遇到边界就折回,重头开始排列,默认从左到右排列
Field:
static int LEFT //对齐方式,从左到右
static int CENTER //对齐方式,从中间向两边
static int RIGHT //对其方式,从右向左
Constructor:
FlowLayout() //默认对齐方式,默认垂直、水平间距
FlowLayout(int align) //指定对象方式(Feild),默认垂直、水平间距
FlowLayout(int align, int hgap, int vgap) //指定对齐方式(Field),指定垂直、水平间距
import java.awt.*;
/**
FlowLayout布局管理器
*/
class FlowLayoutTest
{
Frame f = new Frame();
public void init()
{
//设置Frame容器使用FlowLayout布局管理器
f.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 5));
//向窗口中添加10个按钮
for(int i = 0; i < 10; i++)
{
f.add(new Button("按钮"+i));
}
//设置窗口为最佳大小
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
new FlowLayoutTest().init();
}
}
BorderLayout布局管理器
BorderLayout将容器分为EAST、SOUTH、WEST、NORTH、CENTER五个区域,普通组件可以被放置在这五个区域中任意一个
当改变BorderLayout的容器大小时,NORTH、SOUTH、CENTER区域水平调整,而EAST、WEST、CENTER垂直调整
当向使用BorderLayout布局管理器的容器中添加组件时,需要指定要添加到哪个区域里。如何没有指定,则默认添加到中间区域里
如果向同一个区域中添加多个组件时,后放入的组件会覆盖前面的组件
Frame、Dialog、ScrollPane默认使用BorderLayout布局管理器
当向使用BorderLayout布局管理器的容器中添加组件时,应该使用BorderLayout类的几个静态属性来指定添加到哪个区域
import java.awt.*;
/**
BorderLayout布局管理器
*/
class BorderLayoutTest
{
Frame f = new Frame();
public void init()
{
f.setLayout(new BorderLayout(30,5));
f.add(new Button("东"), BorderLayout.EAST);
f.add(new Button("南"), BorderLayout.SOUTH);
f.add(new Button("西"), BorderLayout.WEST);
f.add(new Button("北"), BorderLayout.NORTH);
f.add(new Button("中"));
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
new BorderLayoutTest().init();
}
}
GridLayout布局管理器
GridLayout布局管理器将容器分割成纵横线分割的网络,每个网格所占的区域大小相同,组件默认从左往右,从上向下依次添加到每个网格中,每个组件将自动涨大到占满整个区域
Constructor:
GridLayout(int rows, int cols) //指定行数,列数,默认横纵向间距将容器分割成多个网格
GridLayout(int rows, int cols, int hgap, int vgap) //指定行数,列数,指定横纵向间距将容器分割成多个网格
import java.awt.*;
/**
GridLayout布局管理器
*/
class GridLayoutTest
{
Frame f = new Frame("计算器");
Panel p = new Panel();
public void init()
{
f.setBounds(500, 200, 300, 200);
f.add(new TextField(), BorderLayout.NORTH);
p.setLayout(new GridLayout(3,5,4,4));
String[] name = {"0","1","2","3","4","5","6","7","8","9",
"+","-","*","/",".",};
for(int i = 0; i < name.length; i++)
{
p.add(new Button(name[i]));
}
f.add(p);
f.setVisible(true);
}
public static void main(String[] args)
{
new GridLayoutTest().init();
}
}
AWT常用组件
AWT组件需要调用运行平台的图像界面来创建和平台一致的对等体,所以AWT只能使用所有平台都支持的公共组件
基本组件
Button:按钮
Canvas:用于绘图的画布
Checkbox:复选框组件(也可变成单选框组件)
CheckboxGroup:用于将多个Checkbox组件组合成一组,一组Checkbox组件将只有一个可以被选中,即全部变成单选框组件
Choice:下拉式选择框组件
Frame:窗口
Label:标签类
List:列表框组件,可以添加多条项目
Panel:不能单独存在的基本容器类,必须放到其他容器中
Scrollbar:滑动条组件
ScrollPane:带水平及垂直滚动条的容器组件
TextArea:多行文本域
TextField:单行文本域
对话框Dialog
对话框(Dialog)是Window类的子类,是一个容器类,属于特殊组件,对话框也是可以独立存在的顶级窗口,因此用法和普通窗口用法几乎完全一样,但有两点需要注意
对话框通常依赖于其他窗口,有一个parent窗口
对话框有非模式(non-modal)和模式(modal)两种
对话框有多个重载的构造器,可能用到如下三个参数
owner:指定该对话框所依赖的窗口,既可以是窗口,也可以是对话框
title:对话框的窗口标题
modal:是否是模式的,true或false
FileLog文件对话框
Dialog类还有一个子类:FileDialog,它代表一个文件对话框,用于打开或者保存文件
FileDialog提供了几个构造器,分别可支持parent、title、mode三个构造函数,mode用于指定该窗口用于打开文件或保存文件,使用如下两个参数值:FileDialog.LOAD、FileDialog.SAVE
注意:
FileDialog不能指定是否是模式对话框,因为FileDialog依赖于运行平台,如果运行平台的文件对话框是模式的,那么FileDialog也是模式的,否则就是非模式的
Method
String getDirectory() //获取被打开/保存文件的路径
String getFile() //获取FileDialog被打开/保存文件的文件名
事件、事件监听器和事件适配器
AWT事件机制涉及到三个成员:事件源、事件和事件监听器,事件监听器必须实现事件监听器接口,事件适配器是事件监听器接口的空实现,事件适配器实现了监听器接口,并为该接口里的每个方法都提供了空实现(无方法体),使用事件适配器只需重写需要的方法
AWT的事件:
ComponentEvent:组件事件,组件尺寸发生变化,位置移动,显隐状态改变时触发
ContainerEvent:容器事件,当容器里添加、删除组件时触发
WindowEvent:窗口事件,打开、关闭、最大化、最小化等
KeyEvent:键盘事件,键盘按下、松开、单击等
MouseEvent:鼠标事件,鼠标单击、按下、松开、移动等
PaintEvent:组件绘制事件,该事件是一个特殊事件类型,当GUI组件调用update/paint方法来呈现自身时将触发该事件
ActionEvent:动作事件,当按钮、菜单项被单击,TextField中按Enter键时触发
AdjustmentEvent:调节事件,在滑动条上移动滑动块
ItemEvent:选项事件,选中某项,或取消选中某项时触发
TextEvent:文本事件,当文本框、文本域里的文本发生改变时触发
import java.awt.*;
import java.awt.event.*;
/**
事件适配器
*/
class CloseTest
{
Frame f = new Frame("测试");
public void init()
{
MyEvent();
f.setBounds(500, 300, 300, 100);
f.setVisible(true);
}
public void MyEvent()
{
//使用了窗体的事件适配器,只重写了关闭窗口事件
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
new CloseTest().init();
}
}
鼠标事件
按钮上既可以加MouseEvent事件,也可以加ActionEvent事件,当单击按钮时,MouseEvent先执行mouseClicked()方法,然后执行ActionEvent事件的actionPerformed()方法,当焦点在按钮上,按键盘的Enter键时,只执行actionPerformed的actionPerformed()方法
鼠标双击
but.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)
System.out.println("双击动作");
}
});
键盘事件
import java.awt.*;
import java.awt.event.*;
/**
键盘事件
*/
class KeyTest
{
Frame f = new Frame("测试");
Button but = new Button("Ctrl+Shift+回车退出");
TextField tf = new TextField(20);
TextArea ta = new TextArea(50, 100);
public void init()
{
myEvent();
f.setBounds(400, 200, 500, 500);
f.add(but, BorderLayout.NORTH);
f.add(tf, BorderLayout.SOUTH);
f.add(ta);
f.setVisible(true);
}
private void myEvent()
{
//but按钮添加键盘监视器
but.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e)
{
//使用组合键,InputEvent类中的isControlDown()
if(e.isControlDown() && e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_ENTER)
{
System.exit(0);
}
}
});
//文本框添加键盘监视器
tf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
if(!(keyCode >= KeyEvent.VK_0 && keyCode <= KeyEvent.VK_9))
{
ta.append(keyCode+"输入非法\n"); //输入到文本域中
e.consume(); //InputEvent中的方法,不按默认的方式处理事件(在这里不把字符输入到文本框)
}
}
});
}
public static void main(String[] args)
{
new KeyTest().init();
}
}
菜单条、菜单和菜单项
AWT中的菜单由如下几个类组合而成:
MenuBar:菜单条,菜单的容器
Menu:菜单组件,菜单项的容器。它也是MenuItem的子类,所以可作为菜单项使用
MenuItem:菜单项组件
PopupMenu:上下文菜单组件(右键菜单组件)
CheckboxMenuItem:复选框菜单项组件
MenuShortcut:菜单快捷键组件
Menu、MenuItem的构造器都可接受一个字符串参数,该字符串作为其对应菜单、菜单项上的标签文本。
除此之外,MenuItem还可以接受一个MenuShortcut对象,该对象用于指定该菜单的快捷键,MenuShortcut类使用虚拟键盘码(而不是字符)来创建快捷键。例如Ctrl-A:
MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A);
如果该快捷键还需要shift键的辅助,则可使用如下代码
MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, true);
AWT中添加菜单分隔符有两种方法:
调用Menu对象的addSeparator方法来添加菜单分割线
添加new MenuItem("-")菜单项来添加菜单分隔符
把一个包含多个MenuItem的Meun添加到另一个Menu中,可以形成二级菜单
import java.awt.*;
import java.awt.event.*;
/**
菜单
*/
class MenuTest
{
private Frame f = new Frame("测试");
private MenuBar mb = new MenuBar();
Menu file = new Menu("文件");
Menu edit = new Menu("编辑");
MenuItem newItem = new MenuItem("新建");
MenuItem saveItem = new MenuItem("保存");
MenuItem exitItem = new MenuItem("退出", new MenuShortcut(KeyEvent.VK_X));
CheckboxMenuItem autoWrap = new CheckboxMenuItem("自动换行");
MenuItem copyItem = new MenuItem("复制");
MenuItem pasteItem = new MenuItem("粘贴");
Menu format = new Menu("格式");
MenuItem commentItem = new MenuItem("注释", new MenuShortcut(KeyEvent.VK_SLASH, true));
MenuItem cancelItem = new MenuItem("取消注释");
TextArea ta = new TextArea(6, 40);
public void init()
{
MyEvent();
file.add(newItem);
file.add(saveItem);
file.add(exitItem);
edit.add(autoWrap);
edit.addSeparator();
edit.add(copyItem);
edit.add(pasteItem);
format.add(commentItem);
format.add(cancelItem);
edit.add(new MenuItem("-"));
edit.add(format);
mb.add(file);
mb.add(edit);
f.setMenuBar(mb);
f.add(ta);
f.pack();
f.setVisible(true);
}
public void MyEvent()
{
ActionListener menuListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String cmd = e.getActionCommand();
ta.append("单击“"+cmd+"“菜单"+"\n");
if(cmd.equals("退出"))
{
System.exit(0);
}
}
};
commentItem.addActionListener(menuListener);
exitItem.addActionListener(menuListener);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
ta.append("用户试图关闭窗口!\n");
System.exit(0);
}
});
}
public static void main(String[] args)
{
new MenuTest().init();
}
}
右键菜单
右键菜单使用PopupMenu对象表示,创建右键菜单的步骤如下:
创建PopupMenu实例
创建多个MenuItemde的实例,依次将这些实例加入PopupMeun中
将PopupMenu加入到目标组件之中
为需要出现右键菜单的组件编写鼠标监听器,当用户释放鼠标时弹出右键菜单
---------------------- ASP.Net+Android+IOS开发</a>、 .Net培训、期待与您交流! ----------------------