二级java程序设计--图形用户界面(1)

来源:互联网 发布:淘宝新店铺如何运营 编辑:程序博客网 时间:2024/05/17 08:36

编写图形用户界面(1)

考点分析和学习目的:
1.掌握AWT编写图形用户界面

2.掌握Swing编写图形用户界面

一.概述

界面设计遵循下列思路:首先是界面中的组建如何放置,其次是如何让组件响应用户的操作,再次是掌握每种组建的现实效果和如何响应用户操作。

二.用AWT编写图形用户界面

抽象窗口工具包AWT(Abstract Window Toolkit)是java提供的建立图形用户界面GUI的开发包。

1.java.awt包提供了基本的GUI设计工具,主要包括组件(Component),容器(Container)和布局管理器(LayoutManager)三个概念,每个概念对应一个类。

2.组件,容器和布局管理器

java图形界面的最基本组成部分是组件(Component),例如一个按钮,标签等。组件不能独立显示出来,必须将组件放在一定的容器中才能显示出来。

3.类java.awt.Component是许多组件的父类,一般编程过程中采用的都是Component类的子类。

Component类的部分重要成员方法:

getName();
getSize();
paint(Graphics g); //绘制组件
repaint() //重新绘制组件
update(); //刷新组件
setVisible(Boolean b); //设置组件是否可见
setSize(Dimension d);

setName(String name);

4.Container是一个类,实际上是Component的子类,因此容器本身也是一个组件,具有组件的所有性质。在实际编程中,往往采用的都是容器类Container的子类。

5.LayoutManager本身是一个接口,编程中通常使用的是实现该接口的类。

三.常用容器:
容器java.awt.Container是Component的子类,一个容器可以容纳多个组件,并使它们成为一个整体。所有的组件都可以通过add()方法加入到容器中。
常用的容器有:Window,Panel等。

1.窗口(Frame)
java.lang.Object
-java.awt.Component
-java.awt.Container
-java.awt.Window
-java.awt.Frame

import java.awt.*;public class FirstFrame extends Frame{public static void main(String[] args){FirstFrame fr = new FirstFrame("First container");fr.setSize(200,200);fr.setBackground(Color.yellow);fr.setVisible(true);}public FirstFrame(String str){super(str);}}
2.面板(Panel)
java.lang.Object
-java.awt.Component
-java.awt.Container
-java.awt.Panel
Panel:面板。既没有标题,也没有边框。与Frame不同,它不能作为最外层的容器单独存在,它首先必须作为一个组件放置到其他容器中,然后再把它作为容器,把其他组件放到它里面。

四.布局管理器
相关类主要包括:FlowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout。
1.FlowLayout布局管理器

import java.awt.*;public class Buttons {    private Frame f;    private Button b1;    private Button b2;    public static void main(String[] args) {        Buttons bt = new Buttons();        bt.go();    }    public void go(){        f = new Frame("Frame1");        f.setLayout(new FlowLayout());        b1 = new Button("submit");        b2 = new Button("reset");        f.add(b1);        f.add(b2);        f.pack();   //紧凑排列        //让窗口尽量下,刚好包容两个组件        f.setVisible(true);    }}
2.BorderLayout布局管理器:是Window,Frame和Dialog的默认布局管理器,把容器分为5个区域:North,South,East,West和Center,每个区域只能放置一个组件。
import java.awt.*;public class BorderLayoutDemo {    public static void main(String[] args) {        Frame f = new Frame("BorderLayout");        f.setLayout(new BorderLayout());        f.add("North",new Button("North"));        f.add("South",new Button("South"));        f.add("East",new Button("East"));        f.add("West",new Button("West"));        f.add("Center",new Button("Center"));        f.setSize(200,200);        f.setVisible(true);    }}

若容器采用BorderLayout进行布局管理,在采用add()方法添加组件的时候,必须指明添加到哪个位置。

三.AWT事件处理模型
在事件处理过程中,主要涉及3类对象:
Event:用户对界面操作在java语言上的描述
Event Source:事件源(事件发生的场所,通常是各个组件)
Event Handler:事件处理者(接收事件对象并对其进行处理的对象)
例:按钮监听器

import java.awt.*;import java.awt.event.*;public class TestButton {    public static void main(String[] args) {        Frame f1 = new Frame("Frame");        Button b = new Button("Button1");        //事件源实例化后,授权注册该类事件的监听器        b.addActionListener(new ButtonHandler());//使用addXXXListener方法来注册监听器        f1.setLayout(new FlowLayout());        f1.add(b);        f1.setSize(200,200);        f1.setVisible(true);    }}//定义相应的事件处理类,实现与该事件相对应的借口XXXListenerclass ButtonHandler implements ActionListener{    @Override    public void actionPerformed(ActionEvent e) {        System.out.println("Action occurred");    }}
使用授权处理模型进行事件处理的一般方法归纳如下:
(1)对于某种类型的事件XXXEvent,要想接收并处理这类事件,必须定义相应的事件处理类,该类需要实现与该事件相对应的接口XXXListener;
class ButtonHandler implements ActionListener{}
(2)事件源实例化以后,必须进行授权,注册该类事件的监听器,使用addXXXListener(XXXListener)方法来注册监听器。

Button b = new Button("Button1");//事件源实例化后,授权注册该类事件的监听器b.addActionListener(new ButtonHandler());
1.事件类
(1)EventObject类:所有事件对象的基础父类
(2)java.awt.AWTEvent:与AWT有关的所有事件都由java.awt.AWTEvent类派生。
这些awt事件分为低级事件和高级事件两大类。低级事件是指基于组件和容器的事件:当一个组件上发生事件,如鼠标的进入,点击,拖放等,或者组件的窗口开关等,都是低级事件。高级事件是基于语义的事件,如在TextField中按enter键,或是选中项目列表的某一选项就触发ActionEvent事件。
1)低级事件
ContainerEvent(容器事件:组件增加/移动)
WindowEvent(窗口事件)
FocusEvent(焦点事件:焦点的获得和丢失)
KeyEvent(键盘事件)
MouseEvent(鼠标事件:鼠标单击,移动)
2)高级事件(语义事件)
ActionEvent(动作事件)
AdjustmentEvent(调节事件)
ItemEvent(项目事件:选择项目,不选择“项目改变”)
TextEvent(文本事件:文本对象改变)

2.事件监听器

3.事件适配器:EventAdapter
例:鼠标适配器

import java.awt.*;import java.awt.event.*;public class MouseClickHandler extends MouseAdapter{public void mouseClicked(MouseEvent e){//...}}
4.用内部类实现事件处理
使用内部类的主要原因:
(1)一个内部类的对象可以访问外部类的成员方法和变量,包括私有成员。
(2)实现事件监听器时,采用内部类,匿名类过程非常容易实现其功能。
(3)编写事件驱动程序,内部类很方便。
5.匿名类:当一个内部类的类声明只是在创建此类对象时用了一次,而要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类。
匿名类本身没有名字,故不存在构造方法,它需要显示调用一个无参的父类的构造方法,并且重写父类的方法。

import java.awt.*;import java.awt.event.*;public class AnonyClass{private Frame f;private TextField tf;public AnonyClass(){f = new Frame("Inner class");tf = TextField(30);}public void launchFrame(){Label label = new Label("Click and drag the mouse");f.add(label,BorderLayout.NORTH);f.add(tf,BorderLayout.SOUTH);f.addMouseMotionListener(new MouseMotionAdapter(){//匿名类开始public void mouseDragged(MouseEvent e){String s = "e.getX(),"+"e.getY()";tf.setText(s);}});f.addWindowListener(new WindowAdapter(){//匿名类开始public void windowClosing(WindowEvent e){System.exit(1);}}); f.setSize(300,200);f.setVisible(true);}public static void main(String[] args){AnonyClass ac = new AnonyClass();ac.launchFrame();}}
四.AWT组件库
1.基本组件的应用
按钮(Button),复选框(Checkbox),复选框组,下拉式菜单(Choice),Canvas,文本输入区(TextArea),列表(List),框架(Frame),对话框(Dialog)...
2.组件与监听器的对应关系