黑马程序员-AWT编程
来源:互联网 发布:斗鱼刷人气软件那个好 编辑:程序博客网 时间:2024/05/17 23:37
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培训、期待与您交流! ----------------------
- 黑马程序员-AWT编程
- 黑马程序员-AWT编程基础知识
- 黑马程序员_王康 java AWT编程
- 黑马程序员Java----AWT
- 黑马程序员---AWT编程基础知识课堂笔记---七个程序
- 黑马程序员_java.awt 模拟记事本
- 黑马程序员—AWT鼠标键盘事件
- 黑马程序员--AWT(要了解)
- 黑马程序员----JAVA GUI 之AWT
- 黑马程序员——AWT,Frame创建窗口简单介绍
- 黑马程序员——AWT鼠标键盘事件
- 黑马程序员——AWT+IO获取文件列表
- 黑马程序员--Java学习19--AWT组件及事件处理
- 黑马程序员——GUI(图形用户界面)中的AWT
- 黑马程序员--Java基础--awt详解以及简单应用
- AWT编程
- AWT编程
- AWT编程:
- UNIX网络编程——信号驱动式I/O
- 读取CLASS文件JDK版本
- C++ Templates FAQ
- base标签与a标签的href属性
- 去掉PowerDesigner生成SQL脚本中字段名带的引号
- 黑马程序员-AWT编程
- MySQL中select语句
- UVa 10055 Hashmat the brave warrior(勇士)
- java 父类子类静态成员,实例成员,构造函数初始化的顺序
- 多媒体函数简介
- 使用VS2008下调试SGI STL源码
- 【解决Win8系统磁盘占用100%的方法】
- VS2012开发PHP,Linux Server运行PHP,支持远程调试
- Android中解析XML