黑马程序员-AWT编程

来源:互联网 发布:斗鱼刷人气软件那个好 编辑:程序博客网 时间:2024/05/17 23:37
---------------------- ASP.Net+Android+IOS开发</a>、.Net培训、期待与您交流! ----------------------


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培训、期待与您交流! ----------------------
原创粉丝点击