图形用户界面
-
作为一个程序设计者,必须优先考虑用户的感受,一定要让用户感到“爽”,我们的程序才会被需要、被使用,这样的程序才有价值。
-
当JDK1.0发布时,Sun提供了一个基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行,这套基本类库被称为“抽象窗口工具集(Abstract Window Toolkit)”,它为Java应用程序提供了基本的图形组件。
AWT简介
-
当JDK1.0发布时,Sun提供了一个基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行,这套基本类库被称为“抽象窗口工具集(Abstract Window Toolkit)”,它为Java应用程序提供了基本的图形组件。
-
AWT (Abstract Window Tools):抽象窗口工具
AWT的缺点
使用AWT作出的图形用户界面在所有平台上都显得很丑陋,功能也非常有限。
AWT为了迎合所有主流操作系统的界面设计,AWT组件只能使用这些操作系统上图形界面组件的交集,所以不能使用特定操作系统上复杂的图形界面组件,最多只能使用四种字体。
AWT用的是非常笨拙的,非面向对象的编程模式。
Swing组件
-
Swing为绝大部分的界面组件都提供了实现。这些界面组件都是直接绘制空白区域上。
-
Swing自己实现了这些界面组件,因此Swing无需使用各操作系统上界面组件的交集。
-
由于Swing不再需要调用操作系统上相应的界面组件,Swing的UI界面更加统一。
java.awt包
在这个包中,提供了基本的java程序GUI设计工具:
-
Component/MenuComponent
-
Container
-
LayoutManager
Container(容器)
-
容器(Container)实际上是Component的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其它组件和容器的功能。
-
容器类对象可使用方法add()添加组件
-
两种主要的容器类型
-
Window:可独立存在的顶级窗口
-
Panel:可作为容器容纳其它组件,但不能独立存在,必须被添加到其它容器中(如Window 或 Applet)
Container层次关系图
Container常用方法
-
add()
-
setLocation():设置位置。
-
setSize():设置大小
-
setBoundes():同时设置大小、位置。
-
setVisible()
-
pack()
组件定制
-
组件的大小和位置由布局管理器(LayoutManager)决定。
-
不使用布局管理器则可以定制组件的大小和位置,但必须在容器中使用组件的setLocation(), setSize(), setBounds()方法确定大小位置
Frame类
-
代表一个窗口。
-
是Window类的子类
-
有标题,可通过拖拉改变大小
-
初始化时为不可见,可用setVisible(true)使其显示出来
-
使用BorderLayout作为其缺省布局管理器
-
使用setLayout方法改变布局管理器
Panel
-
为放置组件提供空间
-
允许使用自己的布局管理器
-
不能单独存在,必须放置到其他容器中
Container的布局管理器
-
为了使我们生成的图形用户界面具有良好的平台无关性,Java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。
-
AWT中的布局管理器有:
-
FlowLayout
-
BorderLayout
-
GridLayout
-
CardLayout
-
GridBagLayout
-
FlowLayout
-
GUI Component从左到右按顺序配置在Container中,若到达右边界,则会折回到下一行中
-
FlowLayout是Panel和Applet的默认管理器
-
FlowLayout()/ FlowLayout(int align)/ FlowLayout(int align,int hgap,int vgap)
-
FlowLayout.LEFT/ FlowLayout.CENTER/ FlowLayout.RIGHT
-
默认为靠中对齐
-
使用组件的理想尺寸
BorderLatout
-
BorderLayout将Container分为EAST、SOUTH、WEST、NORTH、CENTER五个区域,Component可以放置在这五个区域的任何一个
-
BorderLayout是Frame、Dialog的默认管理器
-
每个区域只能放一个组件。如果在一个区域中放入多个Component,后放入的Component会把前面的覆盖
-
BorderLayout()/ BorderLayout(int hgap,int vgap) BorderLayout.EAST、BorderLayout.SOUTH、BorderLayout.WEST、BorderLayout.SOUTH、BorderLayout.CENTER
-
BorderLayout布局格式:当改变容器大小时,当某个区域没有组件时,它的空间会被自动占满。
-
North, South和Center区域水平调整
-
East, West和Center区域垂直调整
-
GridLayout
-
GridLayout将Component配置在纵横格线分割的格子中,从左到右,从上到下;
-
构造器:GridLayout()/ GridLayout(int rows,int cols)/ GridLayout(int rows,int cols,int hgap,int vgap)
GridBagLayout
-
GridBagLayout布局管理器是功能最强大,但也是最复杂的布局管理器,与GridLayout布局管理器不同的是:在GridBagLayout布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相同,从而增加了布局的灵活性。当窗口的大小发生变化时,GridBagLayout布局管理也可以准确地控制窗口各部分的反应。
-
为了处理GridBagLayout中GUI组件的大小、跨越性,Java提供了GridBagConstraints对象,该对象与特定的GUI组件关联,用于控制该GUI组件的大小、跨越性。
CardLayout
-
将加入到Container中的Component看成一叠卡片,只有最上面的那个Componet才可见
-
构造器:CardLayout()/ CardLayout(int hgap,int vgap)
-
控制组件可见的方法:first(Container target) / last(Container target) /previous(Container target) /next(Container target) /show(Container target,String name)
绝对定位
-
Java也提供了那种拖控件的方式,即Java也可以对GUI组件进行绝对定位。在Java容器中采用绝对定位的步骤如下:
-
将Container的布局管理器设成null:setLayout(null)
-
往容器上加组件的时候,先调用setBounds()或setSize()方法来先设置组件的大小、位置。或者直接创建GUI组件时通过构造参数指定该组件的大小、位置,然后将该组件添加到容器中。
-
BoxLayout布局管理器
-
GridBagLayout布局管理器虽然功能强大,但它是在太复杂了,以Swing引入了一个新的布局管理器:BoxLayout。它保留了GridBagLayout的很多优点,但是却没那么复杂。BoxLayout可以在垂直和水平两个方向上摆放GUI组件,BoxLayout提供了一个如下的简单构造器:
-
BoxLayout(Container target, int axis):指定创建基于target容器的BoxLayout布局管理器,该布局管理器里组件案axis方向排列。其中axis有BoxLayout.X_AXIS(横向)和BoxLayout.Y_AXIS(纵向)两个方向。
基本组件
-
Button:按钮,可接收单击操作。
-
Canvas:用于绘图的画布。
-
Checkbox:复选框组件(也可变成单选框组件)。
-
CheckboxGroup:用于将多个Checkbox组件组合成一组,一组Checkbox组件将只有一个可以被选中,即全部变成单选框组件。
-
Choice:下拉式选择框组件。
-
Frame:窗口,在GUI程序里通过该类创建窗口。
-
Label:标签类,用于放置提示性文本。
-
List。列表框组件,可以添加多项条目。
-
Panel:不能单独存在基本容器类,必须放到其他容器中。
-
Scrollbar:滑动条组件。如果需要用户输入位于某个范围的值,就可以使用滑动条组件。如调色板中设置RGB的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向、初始值、滑块的大小、最小值和最大值。
-
ScrollPane:带水平及垂直滚动条的容器组件。
-
TextArea:多行文本域。
-
TextField:单行文本框。
对话框
-
对话框是Window类的子类,是一个容器类,属于特殊组件。对话框也是可以独立存在的顶级窗口,因此用法与普通窗口用法几乎完全一样。但对话框有两点需要注意:
-
对话框必须依赖于其他窗口,就是必须有一个parent窗口。
-
对话框有非模式(non-modal)和模式(modal)两种,当某个模式对话框被打开之后,该模式对话框总是位于它依赖的窗口之上;在模式对话框被关闭之前,它依赖的窗口无法获得焦点。
-
-
对话框有多个重载的构造器,它的构造器可能有如下三个参数:
-
owner:指定该对话框所依赖的窗口,既可以是窗口,也可以是对话框。
-
title:指定该对话框的窗口标题。
-
modal:指定该对话框是否是模式的,可以是true或false。
-
FileDialog
-
Dialog类还有一个子类:FileDialog,它代表一个文件对话框,用于打开、或者保存文件,FileDialog也提供了几个构造器,分别可支持parent、title和mode三个构造参数,其中parent、title指定文件对话框的所属父窗口和标题,而mode用于指定该窗口用于打开文件、或保存文件,该参数支持如下两个参数值:FileDialog.LOAD、FileDialog.SAVE。
事件处理
-
事件(Event) – 一个对象,它描述了发生什么事情
-
事件源(Event source) – 产生事件的组件
-
事件处理方法(Event handler) – 能够接收、解析和处理事件类对象、实现和用户交互的方法
AWT的事件处理方式
-
委派式事件处理(delegation)----个别的组件将整个事件处理委托给特定的对象,当该组件发生指定的事件时,就通知所委托的对象,有这个对象来处理这个事件。这个受委托处理事件的对象称为事件倾听对象(event listener)
-
每个组件均可以针对特定的事件指定一个或多个事件倾听对象,由这些事件倾听对象负责处理事件
窗口事件
-
当一个窗口被激活、撤销激活、打开、关闭、最大化、最小化时,发生窗口事件。
-
从WindowEvent类中创建的对象表示窗口事件。
不同事件类型的接口和方法
分类 | 接口名 | 方法 |
---|---|---|
Action | ActionListener | actionPerformed(ActionEvent) |
Item | ItemListener | itemStateChanged(ItemEvent) |
Mouse Motion | MouseMotionListener | mouseDragged(MouseEvent) |
mouseMoved(MouseEvent) | ||
Mouse | MouseListener | mousePressed(MouseEvent) |
mouseReleased(MouseEvent) | ||
mouseEntered(MouseEvent) | ||
mouseClicked(MouseEvent) | ||
mouseExited(MouseEvent) | ||
Key | KeyListener | keyPressed(KeyEvent) |
keyReleased(KeyEvent) | ||
keyTyped(KeyEvent) | ||
Focus | FocusListener | focusGained(FocusEvnet) |
focusLost(FocusEvent) | ||
Adjustment | AdjustmentListener | adjustmentValueChanged(AdjustmentEvent) |
Component | ComponentListener | componentMoved(ComponentEvent) |
componentHidden(ComponentEvent) | ||
componentResized(ComponentEvent) | ||
componentShown(ComponentEvent) | ||
Window | WindowListener | windowClosing(WindowEvent) |
windowOpened(WindowEvent) | ||
windowIconified(WindowEvent) | ||
windowDeiconified(WindowEvent) | ||
windowClosed(WindowEvent) | ||
windowActivated(WindowEvent) | ||
windowDeactivated(WindowEvent) | ||
Container | ContainerListener | componentAdded(ContainerEvent) |
componentRemoved(ContainerEvent) | ||
Text | TextListener | textValueChanged(TextEvent) |
事件适配器(Adapter)
-
为简化编程,针对大多数事件监听器接口定义了相应的实现类----事件适配器类,在适配器类中,实现了相应监听器接口中所有的方法,但不做任何事情。
-
在定义监听器类时就可以继承事件适配器类,并只重写所需要的方法。
事件处理类的形式
-
利用内部类来处理事件
-
用匿名内部类处理事件
-
定义一个事件监听器类
-
直接在当前类中处理
创建菜单
-
创建一个菜单步骤:
-
创建一个MenuBar对象,将其放置到菜单容器中(如Frame)
-
创建若干个Menu对象,将其放置到MenuBar对象中
-
创建若干个MenuItem对象,将其放置到Menu对象中
-
-
MenuItem包括
-
MenuItem:普通的菜单项
-
CheckboxMenuItem:可以选择的菜单项
-
右键菜单
-
右键菜单使用PopupMenu对象表示,创建右键菜单的步骤如下:
(1)创建PopupMenu的实例。
(2)创建多个MenuItem实例,依次将这些实例加入PopupMenu中。
(3)将PopupMenu加入到目标组件之中。
(4)为需要出现上下文菜单的组件编写鼠标监听器,当用户释放鼠标右键时弹出右键菜单。
在AWT中画图
-
通常,创建Canvas类或Panel的子类,并覆盖paint方法
-
每当组件出现时调用paint方法
-
每个组件都有一个Graphics对象
-
Graphics类实现了很多绘图方法
Graphics类
Graphics是一个抽象的画笔对象,Graphics可以在组件上绘制丰富多彩的几何图形和位图,Graphics类提供了如下几个方法用于绘制几何图形和位图:
-
drawLine:绘制直线。
-
drawString:绘制字符串。
-
drawRect:绘制矩形。
-
drawRoundRect:绘制圆角矩形。
-
drawOval:绘制椭圆形状。
-
drawPolygon:绘制多边形边框。
-
drawArc:绘制一段圆弧(可能是椭圆的圆弧)。
-
drawPolyline:绘制折线。
-
fillRect:填充一个矩形区域。
-
fillRoundRect:填充一个圆角矩形区域。
-
fillOval:填充椭圆区域。
-
fillPolygon:填充一个多边形区域。
-
fillArc:填充圆弧和圆弧两个端点到中心连线所包围的区域。
-
drawImage:绘制位图。
BufferedImage实现类
-
Image类代表了位图,但它是一个抽象类,无法直接创建Image对象,为此Java为它提供了一个BufferedImage实现类,它是一个可访问图像数据缓冲区的Image实现类。该类提供了一个简单的构造器,用于创建一个BufferedImage对象:
-
BufferedImage(int width, int height, int imageType):创建指定大小、指定图象类型的BufferedImage对象,其中imageType可以是BufferedImage.TYPE_INT_RGB、BufferedImage.TYPE_BYTE_GRAY等值
-
-
除此之外,BufferedImage还提供了一个getGraphics()方法返回该对象的Graphics对象,从而允许通过该Graphics对象向Image中添加图形
-
借助于BufferedImage的帮助,我们可以在AWT中实现缓冲技术:当我们需要向GUI组件上绘制图形时,不要直接绘制到该GUI组件上,而是先将图形绘制到BufferedImage对象中,然后再调用组件的drawImage一次性地将BufferedImage对象绘制到特定组件上。
ImageIO输入/输出位图
-
ImageIO类并不能支持读写全部格式的图形文件,程序可以通过ImageIO类的如下几个静态方法来访问该类所支持读写的图形文件格式:
-
getReaderFileSuffixes():返回一个 String 数组,该数组列出ImageIO所有能读的图形文件的文件后缀。
-
getReaderFormatNames():返回一个 String 数组,该数组列出ImageIO所有能读的图形文件的非正式格式名称。
-
static String[] getWriterFileSuffixes()::返回一个 String 数组,该数组列出ImageIO所有能写的图形文件的文件后缀。
-
static String[] getWriterFormatNames():返回一个 String 数组,该数组列出ImageIO所有能写的图形文件的非正式格式名称。
-