10 图形用户界面
10.0 本章内容 1 图形用户界面概述 2 几个常用容器及组件 3 布局管理器 4 事件处理 5 其它常用组件 6 其它常用中间容器 1 图形用户界面概述 2 几个常用容器及组件 3 布局管理器 4 事件处理 5 其它常用组件 6 其它常用中间容器 7 对话框 8 绘图
大部分交互式应用具有GUI外观。Java的外观由GUI组件构成,例如窗口,菜单,按钮,滚动条,列表框等。 10.1 图形用户界面概述 大部分交互式应用具有GUI外观。Java的外观由GUI组件构成,例如窗口,菜单,按钮,滚动条,列表框等。 Java早期用AWT开发图形用户界面。AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,其中包含了一套与本地操作系统图形库交互的接口。 目前组件实现手段有两种:AWT和Swing,分别定义在java.awt和javax.swing包中。 利用AWT来构建图形用户界面时,实际上是利用接口调用操作系统所支持的图形库。由于不同操作系统的图形库是有区别的,在一个平台上存在的功能在另外一个平台上可能不存在。
10.1 图形用户界面概述 Componen的层次关系 Java中构成图形用户界面的各种元素,称为组件(Component)。 组件分为容器(Container)类和非容器类组件两大类 。 容器又分为顶层容器和非顶层容器两大类。 AWT组件一般都是Component的直接子类,是重量级组件,严重地依赖操作系统的实现。 容器类(Container)也是Component类的子类,它可以容纳其它组件,提供层次化的复杂外观。 Window类和Panel类是容器类的子类,GUI设计的一个主要工作就是容器中“摆放”组件。
Swing组件层次关系
10.2 常用容器与组件(Frame &Panel) Component的两个重要子类Frame和Panel。 Frame: Window类的直接子类;初始化为不可见的,可使用setVisible(true)设置为可见的。默认布局为BorderLayout. Panel: 不是顶层窗口,必须位于其他容器内;默认布局为FlowLayout. 示例:TestFrame.java,TestFramewithPanel.java JFrame窗体
JFrame窗体(两个显示示例) 方法1:直接在main()方法中运用JFrame。 TestFrame0.java 方法2:应用JFrame派生类MyFrame。 TestFrame2.java
其他Component子类 下面是部分awt组件列表 Button Canvas Label Choice Checkbox List TextArea TextField Scrollbar FileDialog Container ScrollPane Window Panel Frame Dialog Applet 见awt组件范例(AWTExample.java)
GUI编程过程 设计和实现图形用户界面的工作主要有以下几点。 (1)创建组件(Component): 创建组成界面的各种元素,如按钮、文本框等。 (2)指定布局(Layout): 根据具体需要排列它们的位置关系。 (3)响应事件(Event): 定义图形用户界面的事件和各界面元素对不同事件的响应, 从而实现图形用户界面与用户的交互功能。
10.3 布局管理LayoutManager 由于AWT组件是利用同级件机制借助于操作系统基础视窗系统的组件来实现的,那么应用的外观在不同平台之间移植可能会导致一个糟糕的外观。 Java引入布局管理器模式,把组件的布局任务交给布局管理器,这个模式不主张明确指出组件的大小和位置,而主张让编程人员选择布局理器,提供布置策略,运行时,再由布局管理器对象确定容器中组件的具体大小和位置。 LayoutManager接口定义了布局管理器的“工作”。
常用布局管理器 FlowLayout:流布局管理器 GridLayout:网格布局管理器 BorderLayout:方位布局管理器 五种常用布局管理器: FlowLayout:流布局管理器 GridLayout:网格布局管理器 BorderLayout:方位布局管理器 CardLayout:卡片布局管理器 BoxLayout:盒式布局管理器 使用Container类的 public void setLayout(LayoutManager lm) 方法设置某种布局策略。
布局的示例 FlowLayout是Panel及Applet默认使用的布局管理器。 TestFlowLayout.java BorderLayout是Frame和Dialog默认的。 TestBorderLayout.java FlowLayout布局对组件逐行定位,行内从左到右,一行排满后换行 默认对齐方式为居中对齐 不改变组件的大小,按组件原有尺寸显示组件 可在构造方法中设置不同的组件间距、行距及对齐方式 前面的示例是用AWT组件实现的,请读者自行改为用Swing组件实现.
FlowLayout布局管理器 new FlowLayout(FlowLayout.RIGHT,20,40); 右对齐,组件之间水平间距20个像素,竖直间距40个像素; new FlowLayout(FlowLayout.LEFT); 左对齐,水平和竖直间距为缺省值:5; new FlowLayout(); 使用缺省的居中对齐方式,水平和竖直间距为缺省值:5;
BorderLayout 布局管理器 Center BorderLayout是Frame类的默认布局管理器 注意:每个区域只能加入一个组件, 如加入多个,则先前加入的 组件会被遗弃 North South West Eest Center
GridLayout 布局管理器 GridLayout型布局管理器将布局划分成规则的矩形网格,每个单元格区域大小相等. 组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下. 在GridLayout构造方法中指定分割的行数和列数. new GridLayout(3,4); 示例:TestGridLayout.java
布局管理器总结 如果为容器选用布局管理器,那么容器中组件的位置和大小完全有布局管理器决定。 因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java语言提供的setLocation(),setSize(),setBounds()等方法,则都会被布局管理器覆盖。 如果用户确实需要亲自设置组件大小或位置,可以通过setLayout(null)方法不为容器选用任何布局管理器。这样可以通过编程来实现组件布局。 通过编码调用组件的 setLocation(), setSize(), 或 setBounds()方法来实现布局,但是编码工作量大,一般使用IDE来实现一个“所见即所得”的GUI画面,然后由IDE辅助生成代码。 每个容器都有一个默认的布局管理器。
布局管理器总结 JFrame JFrame是一个顶级窗口。 JFrame的缺省布局管理器为BorderLayout。 JPanel JPanel的缺省布局管理器为FlowLayout。 当把JPanel作为一个组件添加到某个容器中后,该JPanel仍然可以有自己的布局管理器。因此,可以利用JPanel使得BorderLayout中某个区域显示多个组件。 综合应用示例:例10-4TestGui.java,例10-5TestGui2.java
10.4 事件处理(事件及事件监听器) Java中的图形用户界面中,对于用户的鼠标、键盘操作发生反应,就必须进行事件处理。 10.4 事件处理(事件及事件监听器) Java中的图形用户界面中,对于用户的鼠标、键盘操作发生反应,就必须进行事件处理。 产生事件的对象是事件源。 这些鼠标、键盘操作等统称为事件(Event)。 对这些事件作出响应的程序,称为事件处理器(Event handler)。 Java的事件处理委托模型: 组件将事件处理的责任委托给特定的对象,当该组件发生指定的事件时,就通知所委托的对象,由这个对象来处理此事件。这个受委托的对象称为事件监听对象(eventlistener),每个组件都可根据需要指定(注册)一个或多个事件监听对象。
10.4 事件处理 (Java事件处理模型)
(1)给事件源填加监听器 addXXXListener() 事件处理设计要做3件事 事件编程中的几个要素: 事件类------继承于AWTEvent类 事件源-----可通过getSource()方法得到 事件监听器:针对特定事件的事件监听对象(自定义的类) 事件服务程序:事件产生时所执行的程序 (1)给事件源填加监听器 addXXXListener() (2)设计一个监听器的实现类,其含有实践服务的代码,其实现监听器中的事件服务方法。此称为事件服务类。 (3)用事件服务类创建一个对象,作为上述注册事件监听器的实参。
事件监听器框架是由Java系统本身完成的,它的消息响应方法形式是固定的形式,所以一定是多态调用方式. 10.4 事件处理(事件处理内容) 事件监听器框架是由Java系统本身完成的,它的消息响应方法形式是固定的形式,所以一定是多态调用方式. 又因为不同事件源产生多种多样的事件,Java系统把消息分了类,每类对应一个或几个特定的方法,定义在不同的接口中,我们只需要按规则实现接口中定义的方法就可以了。 Java图形界面处理的主要事件内容如表10.1所示。 依据设计实现的监听类的位置不同可以分为下面几种模式: (1)当前类是事件监听器类 (this对象去监听事件源) (2)外部类outclass是事件监听器类(outclass对象去监听事件源) (3)内部类是事件监听器类(内部类对象去监听事件源) (4)匿名类是事件监听器类(匿名类对象去监听事件源)
10.4 事件处理(在事件处理中使用内部类及匿名类) 10.4 事件处理(在事件处理中使用内部类及匿名类) 在Java事件处理程序中,由于与事件相关的事件监听器的类经常局限于一个类的内部,所以经常使用内部类。 可以方便地访问包装类的成员; 内部逻辑清晰; 该类不可以也不需要被其他类访问。 而且定义的内部类在事件处理中的使用就实例化一次(在其他地方不会用到该类,所以不需要类名),所以经常使用匿名类。
10.4 事件处理(事件适配器) 一个类实现一个接口,必须实现接口中的全部方法。 10.4 事件处理(事件适配器) 一个类实现一个接口,必须实现接口中的全部方法。 用实现接口的方法,例如WindowListener接口包括7个方法,即使一些方法不做任何事情,也得书写。 为简化编程,针对一些事件监听器接口定义了相应的实现类——事件适配器类(Adapter),在适配器类中,实现了相应监听器接口中所有的方法,但不做任何事情。
10.4 事件处理(事件适配器) 事件适配器包括如下几种: (1)ComponentAdapter(组件适配器); 10.4 事件处理(事件适配器) 事件适配器包括如下几种: (1)ComponentAdapter(组件适配器); (2)ContainerAdapter(容器适配器); (3)FocusAdapter(焦点适配器); (4)KeyAdapter(键盘适配器); (5)MouseAdapter(鼠标适配器); (6)MouseMotionAdapter(鼠标运动适配器); (7)WindowAdapter(窗口适配器)。 程序中可以继承事件适配器类,并只重写所需要的方法,而不用写那些空的方法体。 【例10-9】给窗口加鼠标事件,当按下鼠标时,退出应用程序. TestMouseEvent.java
10.5 其他常用组件 10.5.1 JCheckBox、JRadioButton 10.5.2 JComboBox 10.5.3 JList 10.5.4 JTable 参见相应的例子
10.7 对话框(概述) 对话框是常用的数据操作窗口,它和JFrame一样,都是顶层容器,可以独立显示。 对话框分为无模式和有模式两种情况。 10.7 对话框(概述) 对话框是常用的数据操作窗口,它和JFrame一样,都是顶层容器,可以独立显示。 对话框分为无模式和有模式两种情况。 无模式对话框含义是:当该对话框出现后,仍可切换到其它组件界面,进行相应操作,可以理解为“并行”操作; 有模式对话框含义是:当该对话框出现后,不能切换到其它组件界面,只能该界面操作结束后,才能进行其它组件界面的操作,可以理解为“串行”操作。
10.7 对话框(JDialog类) 对话框被封装在JDialog类中 JDialog常用方法如下。 • JDialog(Frame owner) ; 构造一个没有标题的无模式对话框。 • JDialog(Frame owner, boolean modal); 构造一个没有标题的对话框,boolean型参数modal指定是否为模式对话框。 • JDialog(Frame owner, String title) ; 构造一个有标题的无模式对话框。 • JDialog(Frame owner, String title, boolean modal) ; 构造一个有标题的对话框,boolean型参数modal指定是否为模式对话框窗。
10.8 绘图 绘制图形和文字主要用到类Graphics,也叫做绘图环境类。 组件中两个最主要的与绘图相关的方法是paint(Graphics g)及repaint()。 当组件被显示时调用paint(Graphics g)方法,每当需要重绘组件时,调用repaint()方法,该方法又自动调用paint(Graphics g)方法。 重绘组件发生情况可能是:组件被其它窗口覆盖,移走其它窗口;该组件极小化又恢复后;窗口大小发生变化。 一般说来,paint()方法由系统在恰当的时候调用,编程者不能主动调用。绘制图形的工作应尽量在paint()方法中完成。
10.8 绘图 熟悉在图形界面上绘图的基本操作,了解在Applet中进行绘图。 1) A 直接绘制窗体 重写 JFrame的paint( Graphics g) B 绘制JPanel将面板加入JFrame中显示重写JPanel面板的 paintComponent(Graphics g) C Applet中重写paint ( Graphics g)方法。 2) Graphics g类的绘图方法参见API: drawXXX(); fillXXX();
3)设置绘图画笔颜色Color和字体Font Color c=new Color(int ,int ,int ); Font f=new Font(“字体名”,样式,磅值); g.setColor(c); g.setFont(f); 4) 绘制图片: try{ Image im=ImageIo.read(new file(“image/s.jpg”)); g.drawImage(im,50,50,null); }catch(Exception e){} 示例:【例10-27】在JPanel面板上画坐标(10,10)~(50,50)的直线。 TestDraw.java
音频文件的播放 用java可以播放.au,.aiff,.wav,.mid,.rfm格式的音频文件,播放步骤如下: 1.创建File对象 File f=new File(“sound\h.mid”); 2.获取URI对象 URI i=f.toURI(); 3.获取URL对象 URL l=i.toURL(); 4.生成AudioClip 对象 AudioCilp clip=Applet.newAudioClip(l); 由于要进行基本的IO操作所以前4步必须放在异常处理框架中; 5.控制播放 clip.play(); clip.loop();clip.stop(); 需导入的包:java .Io.*;java.applet.*;java.net.*;
本章小结 awt和Swing Frame和Panel 布局管理器使用及特点 事件响应机制 项目管理部分: 在JCreator 中编写带素材的应用程序,像要使用的图片,音频文件,可以在项目中建立一个文件夹命名为image或audio,在其中放源文件; 在程序中使用: ../image/a.jpg 或../audio/a.midi去关联文件。