AWT编程

图形用户界面

  • 作为一个程序设计者,必须优先考虑用户的感受,一定要让用户感到“爽”,我们的程序才会被需要、被使用,这样的程序才有价值。

  • 当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包

 

AWT编程

在这个包中,提供了基本的java程序GUI设计工具:

  • Component/MenuComponent

  • Container

  • LayoutManager

Container(容器)

  • 容器(Container)实际上是Component的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其它组件和容器的功能。

  • 容器类对象可使用方法add()添加组件

  • 两种主要的容器类型

  1. Window:可独立存在的*窗口

  2. Panel:可作为容器容纳其它组件,但不能独立存在,必须被添加到其它容器中(如Window 或 Applet)

Container层次关系图

AWT编程

 

Container常用方法

  • add()

  • setLocation():设置位置。

  • setSize():设置大小

  • setBoundes():同时设置大小、位置。

  • setVisible()

  • pack()

组件定制

  • 组件的大小和位置由布局管理器(LayoutManager)决定。

  • 不使用布局管理器则可以定制组件的大小和位置,但必须在容器中使用组件的setLocation(), setSize(), setBounds()方法确定大小位置

Frame类

  • 代表一个窗口。

  • 是Window类的子类

  • 有标题,可通过拖拉改变大小

  • 初始化时为不可见,可用setVisible(true)使其显示出来

  • 使用BorderLayout作为其缺省布局管理器

  • 使用setLayout方法改变布局管理器

Panel

  1. 为放置组件提供空间

  2. 允许使用自己的布局管理器

  3. 不能单独存在,必须放置到其他容器中

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容器中采用绝对定位的步骤如下:

    1. 将Container的布局管理器设成null:setLayout(null)

    2. 往容器上加组件的时候,先调用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)

  • 为简化编程,针对大多数事件监听器接口定义了相应的实现类----事件适配器类,在适配器类中,实现了相应监听器接口中所有的方法,但不做任何事情。

  • 在定义监听器类时就可以继承事件适配器类,并只重写所需要的方法。

事件处理类的形式

  1. 利用内部类来处理事件

  2. 用匿名内部类处理事件

  3. 定义一个事件监听器类

  4. 直接在当前类中处理

创建菜单

  • 创建一个菜单步骤:

    • 创建一个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所有能写的图形文件的非正式格式名称。