AWT编程

本文详细介绍了Java的AWT库,包括图形用户界面的基础、AWT组件、布局管理器、事件处理等方面,展示了如何创建和定制组件,以及如何处理用户交互。通过各种布局管理器的示例,解释了如何有效地组织组件,如FlowLayout、BorderLayout和GridBagLayout。此外,还讨论了对话框、菜单和图形绘制,提供了使用Graphics类和BufferedImage进行图像操作的方法。
摘要由CSDN通过智能技术生成

图形用户界面

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

  • 当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()添加组件

  • 两种主要的容器类型

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

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

Container层次关系图

 

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类中创建的对象表示窗口事件。

不同事件类型的接口和方法

分类接口名方法
ActionActionListeneractionPerformed(ActionEvent)
ItemItemListeneritemStateChanged(ItemEvent)
Mouse MotionMouseMotionListenermouseDragged(MouseEvent)
mouseMoved(MouseEvent)  
MouseMouseListenermousePressed(MouseEvent)
mouseReleased(MouseEvent)  
mouseEntered(MouseEvent)  
mouseClicked(MouseEvent)  
mouseExited(MouseEvent)  
KeyKeyListenerkeyPressed(KeyEvent)
keyReleased(KeyEvent)  
keyTyped(KeyEvent)  
FocusFocusListenerfocusGained(FocusEvnet)
focusLost(FocusEvent)  
AdjustmentAdjustmentListeneradjustmentValueChanged(AdjustmentEvent)
ComponentComponentListenercomponentMoved(ComponentEvent)
componentHidden(ComponentEvent)  
componentResized(ComponentEvent)  
componentShown(ComponentEvent)  
WindowWindowListenerwindowClosing(WindowEvent)
windowOpened(WindowEvent)  
windowIconified(WindowEvent)  
windowDeiconified(WindowEvent)  
windowClosed(WindowEvent)  
windowActivated(WindowEvent)  
windowDeactivated(WindowEvent)  
ContainerContainerListenercomponentAdded(ContainerEvent)
componentRemoved(ContainerEvent)  
TextTextListenertextValueChanged(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所有能写的图形文件的非正式格式名称。

       

AWTK开发手册-AWTK开发实践指南-中文手册.pdf AWTK = Toolkit AnyWhere 随着手机、智能手表等便携式设备的普及,用户对 GUI 的要求越来越高,嵌入式系统对高性能、高可靠性、低功耗、美观炫酷的 GUI 的需求也越来越迫切,ZLG开源 GUI 引擎 AWTK 应运而生。AWTK 全称为 Toolkit AnyWhere,是 ZLG 倾心打造的一套基于 C 语言开发的 GUI 框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎,并支持跨平台同步开发,一次编程,终生使用。 最终目标: 支持开发嵌入式软件。 支持开发Linux应用程序。 支持开发MacOS应用程序。 支持开发Windows应用程序。 支持开发Android应用程序。 支持开发iOS应用程序。 支持开发2D游戏。 其主要特色有: 小巧。在精简配置下,不依赖第三方软件包,仅需要32K RAM + 256K FLASH即可开发一些简单的图形应用程序。 高效。采用脏矩形裁剪算法,每次只绘制和更新变化的部分,极大提高运行效率和能源利用率。 稳定。通过良好的架构设计和编程风格、单元测试、动态(valgrind)检查和Code Review保证其运行的稳定性。 丰富的GUI组件。提供窗口、对话框和各种常用的组件(用户可以配置自己需要的组件,降低对运行环境的要求)。 支持多种字体格式。内置位图字体(并提供转换工具),也可以使用stb_truetype或freetype加载ttf字体。 支持多种图片格式。内置位图图片(并提供转换工具),也可以使用stb_image加载png/jpg等格式的图片。 紧凑的二进制界面描述格式。可以手工编辑的XML格式的界面描述文件,也可以使用Qt Designer设计界面,然后转换成紧凑的二进制界面描述格式,提高运行效率,减小内存开销。 支持主题并采用紧凑的二进制格式。开发时使用XML格式描述主题,然后转换成紧凑的二进制格式,提高运行效率,减小内存开销。 支持裸系统,无需OS和文件系统。字体、图片、主题和界面描述数据都编译到代码中,以常量数据的形式存放,运行时无需加载到内存。 内置nanovg实现高质量的矢量动画,并支持SVG矢量图。 支持窗口动画、控件动画、滑动动画和高清LCD等现代GUI常见特性。 支持国际化(Unicode、字符串翻译和输入法等)。 可移植。支持移植到各种RTOS和嵌入式Linux系统,并通过SDL在各种流行的PC/手机系统上运行。 脚本化。从API注释中提取API的描述信息,通过这些信息可以自动生成各种脚本的绑定代码。 支持硬件2D加速(目前支持STM32的DMA2D和NXP的PXP)和GPU加速(OpenGL/OpenGLES/DirectX/Metal),充分挖掘硬件潜能。 丰富的文档和示例代码。 采用LGPL协议开源发布,在商业软件中使用时无需付费。 目前核心功能已经完成,内部开始在实际项目中使用了,欢迎有兴趣的朋友评估和尝试,期待您的反馈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值