【java基础】第五章 图形化用户界面

#java使用AWT和Swing包两套组件实现图形化用户界面。

#图形化用户界面(GUI,Graphics User Interface)

#java提供的图形化用户界面组件全都在java.awt包中。

#AWT提供的图形功能是各种通用操作系统所提供功能的交集,由于是依靠本地方法来实现其功能的,因此通常把AWT控件称为重量级控件。

Swing是在AWT基础上构建的一套新的组件,提供了AWT的所有功能,并对AWT进行了扩充,是AWT的改良版。Swing中没有使用本地方法来实现图形功能,因此称为轻量级控件。

#AWT和Swing之间的基本区别:从直接命名来看,Swing组件通常有大写字母J开头,从运行效率来看,由于AWT是基于本地方法的C/C++程序(Swing是基于AWT的java代码),其运行速度较快。从适用对象来看,简单高效的AWT适于嵌入式java(硬件资源有限),pc或工作站的标准java应用中(硬件资源较多,需求较高)用Swing。

 

#

AWT层次结构
​​​

Swing组件都是AWT的Container类的直接子类或间接子类。与AWT相比,Swing提供了更完整的组件,引入了许多新的特性和功能。SwingAPI是围绕着实现AWT各个部分API构建的,这保证了所有早期的AWT组件仍然可以使用。在javax.swing包中,定义了两种类型的组件,顶层容器(JFrame,JApplet,JDialog和JWindow)和轻量级组件。顶层容器仍属于重量级控件,而其他的轻量级组件都是围绕一个JComponet组件构建的。JComponent则由AWT的Container类扩展而来。

 

#Swing组件:

Swing层次结构

如图所示,Swing组件从API类使用上可分为三大类

①容器类,包含其他组件的容器,包括顶层容器(JFrame,JApplet等)和一般容器(JPanel等)。容器是一种特殊的组件,可以包含其他组件。新类继承容器类,用Container obj=getContentPane()获取容器,obj.add(组件)将组件添加到容器中,obj.setLayout()设置布局。

②控件类,都是JComponent类(抽象类)的子类,多数能相应事件,如JButton,JTextField,JTextArea,JComboBox,

3,辅助类,描述和绘制容器类和组件类的属性和位置,如图形环境,颜色,字体,大小,摆放位置,例如:Graphics,Color,Font,FontMetrics等

注:所有的Swing组件都实现了Accessible接口,提供对可存取性的支持,使得辅助功能如(屏幕阅读器)能够十分方便地从Swing组件中得到信息。在Swing组件中,使用JComponent类的registerKeyboardAction()方法,能使用户通过键盘操作代替鼠标驱动GUI上的Swing组件的相应动作。有些类还为键盘操作提供了更便利的方法,其实相当于热键,使得用户可以只通过键盘进行操作;对Swing组件可以设置一个或多个边框。一种空白边框可以增大组件,同时协助布局管理器对容器中的组件进行合理的布局;与AWT的组件不同,许多Swing组件如按钮,标签等,除了使用文字外,还可以使用图标作为装饰。

 #JFrame类 窗体组件;JLabel类,标签组件,用于显示文本,图像,或同时显示两者,JButton类,按钮组件,可出发特定动作,JTextField类,单行文本框组件,JTextArea类,多行文本框组件,

 

#java事件处理机制。

事件处理是指java应用能够对某些事件做出响应。事件表达了系统,应用程序及用户之间的动作和响应。图形用户界面利用事件机制实现用户与程序的交互。产生事件的组件称为事件源。如当用户单击某个按钮时就会产生动作事件,该按钮就是一个事件源。要处理产生的事件,需要在特定的方法中编写处理事件的程序。这样,当产生某种事件时就会调用处理这种事件的方法,从而实现用户和程序的交互,这就是图形用户界面事件处理的基本原理。

java中,每种事件都属于一个事件类,具体的事件则是事件的实例;程序通过事件监听器对象,捕获到用户激发的消息,并执行相关的事件处理方法。

java程序运行过程中,可能发生的事件种类繁多,选择相应事件的过程,称为注册。所谓注册就是某对象向事件源提出申请,表明自己对某类事件感兴趣,希望该事件发生时得到通知。提出申请的对象称为监听器。监听器只接收注册事件。

eg 为确定按钮注册action事件的监听器

JButton confirmButton=new JButton("确定");
confirmButton.addActionListener(handler);
//handler为监听器类对象,监听器类需自己定义,实现ActionListener接口(监听器接口),
//实现actionPerformed(ActionEvent event)方法,event是ActionEvent事件对象,
//即单击事件对象,
//button是事件源,handler是事件监听器对象

当按钮被按下时(action事件发生),监听器执行某种操作,称为对事件响应。

并非任何类都是监听器类,java对监听器的行为特征有一定要求,这些要求的具体表现就是监听器接口。监听器接口规定了该监听器应该实现的功能,只有实现了监听器接口的类才是监听器类。

一个事件可以由多个事件源产生,而注册在该事件类上的监听器也可以不只一个,因此,事件源,事件和监听器之间具有多对多的关系。这种多对多的关系,构成了对象之间相互沟通的网路,使得对象既可以协同一致,又可以保持各自的相对独立。这正是事件驱动模式的精髓所在。

要想使GUI接收用户的操作,就必须给各个组件加上事件的监听机制。在事件处理过程中,主要涉及三类对象:

①事件对象(Event Object):用于监听器(Listener)方法中的参数,如actionPerform方法。由KeyEvent,ActionEvent事件。

②事件源(Event Source):例如单击一个按钮,这个按钮就是事件源,要使该按钮对某些事件进行响应,就需要为按钮注册特定的监听器(addxxxListener)

3,事件监听器(Event Listener):或称作事件处理者(Event Handler)。当它监听到事件对象产生时,就调用相应方法。

java Swing中处理各种组件事件的一般过程:首先为要响应事件的组件(事件源)注册事件监听器,当组件监听到外部作用时,生成事件对象,传入事件监听器,调用相应处理方法。

 

#编写事件处理程序包括以下三个步骤;

一,定义监听器类,在类的定义中完成事件的处理(实现actionPerform())方法。

二,通过new创建事件监听器类对象。

三,为组件注册相应的事件监听器对象addxxxListener();

采用两种方法实现上述三个步骤,第一是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件;第二是使用多个内部类来响应不同组件产生的各自事件,其具体实现又分为两种形式,一个是匿名内部类,一个是一般内部类。

 

①直接实现监听器类方式

public class ButtonAct extends JFrame implements ActionListener{    //第一步
    private JButton b1;
        .....
    public ButtonAct(){
        .....
    b1.addActionListener(this);;
    add(b1);                                                        //第二步,第三步
        .....
                        }
    public void actionPerformed(ActionEvent e){
                    who.setText("Button 1");                        //定义处理方法
                                                }
        .....
}

程序说明:第一步为定义监听器类,第一行代码将主类ButtonAct声明为实现动作接口ActionListener的监听器类,在主类内部第十行代码开始利用actionPerform()方法完成事件处理。第二步为创建监听器对象。第三步为注册事件监听器。第6行代码为按钮1注册监听器,监听器对象即为ButtonAct类的对象this。

②内部类方式

方式一(一般内部类):

public class ButtonAct extends JFrame{
    private JButton b1;
        .....
    public ButtonAct(){
        .....
        b1.addActionListener(new B1());
        add(b1);
        .....
                        }
    class B1 implements ActionListener{
        public void actionPerformed(ActionEvent e){
                who.setText("Button  1");
                                                    }
                                        }
        .....
}

还可以:

public class ButtonAct extends JFrame{
        private JButton b1;
        .....
        public ButtonAct(){
            .....
            b1.addActionListener(handler);
            add(b1);
            .....
                            }
        private B1 handler=new B1();
        class B1 implements ActionListener{
                public void actionPerformde(ActionEvent e){
                    ......
                                                            }
                                            }
        .....
}

方式二(匿名内部类):

public class ButtonAct extends JFrame{
    private JButton b1;
    .....
    public ButtonAct(){
        .....
        b1.addActionListener(
                   new ActionListener(){
                        public void actionPerformed(ActionEvent e){...}
                                        }
                            );
        add(b1);
        ......
                        }
    }

还可以:

public class ButtonAct extends JFrame{
    private JButton b1;
    .....
    public ButtonAct(){
        .....
        b1.addActionListener(hander);
        add(b1);
        .....
                        }
    private ActionListener handler=new ActionListener(){
            public void actionPerformed(ActionEvent e){
                .....
                                                        }
                                                            }
        .....
}

 

#事件类与事件监听接口

java.until.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。AWT的相关事件继承与java.awt.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件。低级事件是指基于组件和容器的事件,当一个组件发生事件如:鼠标的进入,单击,释放等,或组件的窗口开关等,便触发了组件事件。高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在JTextArea中按Enter键会触发ActionEvent事件,滑动滚条会触发AdjustmentEvent事件,或是选中项目列表的某一条就会触发ItemEvent事件。

AWTEvent事件类

在图中AWTEvent的低级事件包括:

组件事件(ComponentEven),控制组件尺寸的变化和移动;

容器事件(ContainerEvent),控制组件增加减少与移动;

窗口事件(WidowEvent),控制窗口关闭,还原,窗口最小化

焦点事件(FocusEvent),负责焦点的获得和丢失,

鼠标事件(MouseEvent),负责捕捉鼠标的单击与移动

高级事件包括:

动作事件(ActionEvent)激活组件,如单击按钮,在文本框中按Enter等

调节事件(AdjustmentEvent),在滚动条上移动滑块以调节数值;

项目事件(ItemEvent),选择项目;

文本事件(TextEvent),文本对象改变。

 

下表是常用事件及监听器接口:

标题

 

#事件适配器

对定义的事件监听器接口,他可能包含多个事件处理方法,但在使用是往往只需要一个,此时就可以使用事件适配器将事件监听接口抽象化,事件适配器给出每一个接口方法的默认实现,这样在需要使用某方法时,只需要重写所需方法即可。

下面是事件监听器接口与事件适配器对照表:

适配器与监听器接口对照表

以MouseAdapter(鼠标适配器为例):

public abstract class MouseAdapter extends Object
implements MouseListener,MouseWheelListener,MouseMotionListener{
    mouseClicked(){};
    ......
    mouseWheelMoved(){};
}

因为MouseListener和MouseMotionListener里面有很多方法,不一定都需要,所以引入MouseAdapter这个抽象类,默认实现两个接口,需要监听器对象时,new一个Adapter对象,实现需要的方法即可。

采用适配器设计模式可以只关注感兴趣的事件,其他事件交由适配器的空方法进行默认处理。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值