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包
在这个包中,提供了基本的java程序GUI设计工具:
-Component/MenuComponent
-Container
-Layout

Container(容器)
容器(Container)实际上是Component的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其他组件和容器的功能。
容器类对象可使用方法add()添加组件
两种主要容器类型
-Window:可独立存在的顶级窗口
-Panel:可作为容器容纳其他组件,但不能独立存在,必须被添加到其他容器中(如Window或Applet)

Container层次关系图
Applet-->Panel-->Container
Frame-->Window--->Container
Dialog--->Window-->Container
ScrollPane-->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
默认为靠中对齐
使用组件的理想尺寸

BorderLayout
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(con.);
BorderLayout布局格式:当改变容器大小时
-当某个区域没有组件时,它的空间会被自动占满。
GridLayout
GridLayout将Component配置在纵横格线分割格子中,从左到右,从上到下;
构造器:GridLayout()/GriLayout(int rows ,int cols)/GridLayout(int rows,int cols,int hgap,int vgap)

GridBagLayout
GridBagLayout布局管理器是功能最强大,但也是最复杂的布局管理器,与GridLayout布局器不同的是:在GridBagLayout布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相同,从而增加了布局的灵活性。当窗口的大小发生变化时,GridBagLayout布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相同,从而增加了布局的灵活性。当窗口的大小发生变化时,GridBagLayout布局管理也可以准确地控制窗口各部分的反应。
为了处理GridBagLayout中GUI组件的大小,跨越性,Java提供了GridBagLayout中GUI组件的大小,跨越性,javat提供了GridBagConstraints对象,该对象特定的GUI组件关联,用于控制该GUI组件大小,跨越性。

GardLayout
将加入到Container中的Component看成一叠卡片,只有最上面的那个Compnnent才可见
构造器:CardLayout()/CardLayout(int hgap,int vgaop)
控制组件可见的方法:first(Container target)/last(Container target)/privious(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:y用于绘图的画布。
Checkbox:复选框组件(也可变成单选框组件)。
CheckboxGroup:用于将多个Checkbox组件合成一组,一组Checkbox组件将只有一个可以被选中,即全部变成单选框组件。
Choice:下拉式选择框组件。
Frame:窗口,在GUI程序里通过该类创建窗口。
Lable:标签类,用于放置提示性文本。
List。列表框组件,可以添加多条项目。
Panel:不能单独存在基本容器类,必须放到其他容器中。
Scrollbar:滑动条组件。如果需要用户输入位于某个范围的值,就可以使用滑动条组件。如调色板中设置RGB的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向,初始值,滑块的大小,最小值和最大值。
ScrollPane:带水平及垂直滚动条的容器组件。
TextArea:多行文本域。
TextField:单行文本框。

对话框
对话框是Window 类的子类,是一个容器类,属于特殊组件。对话框也是可以独立存在的顶级窗口,因此用法与普通窗口用法几乎完全一样。但对话框有两点需要注意:-
-对话框必须依赖于其他窗口,就是必须有一个parent窗口。
-对话框有非模式(non-modal)和模式(modal)两种,当某个模式对话框被打开之后,该模式对话框总是位于它依赖的窗口之上;在模式对话框被关闭之前,它依赖的窗口无法获得焦点。
对话框有多个重载的构造器,它的构造器可能有如下三个参数:
-owner:指定该对话框所依赖的窗口,即可以是窗口,也可以是对话框。
-title:指定该对话框的窗口标题。
-modal:指定该对话框是否是模式的,可以是truefalse.

FileDialog
Dialog类还有一个子类:FileDialog,它代表一个文件对话框,用于打开,或者保存文件,FileDialog也提供了几个构造器,分别支持parent,title指定文件对话框的所属父窗口和标题,而mode用于指定该窗口用于打开文件,或保存文件,该参数支持如下两个参数值:FileDialog.LOAD,FileDialog.SAVE。

事件处理
事件(Event)--一个对象,它描诉了发生什么事情
事件源(Event source)-产生事件的组件
事件处理方法(Event handler)-能够接收,解析和处理事件类对象,实现和用户交互的方法。

AWT的事件处理方式
委派式事件处理(delegation)----个别的组件将整个事件处理委托给特定的对象,当该组件发生指定事件时,就通知所委托的对象,有这个对象来处理这个事件。这个受委托处理事件的对象称为事件倾听对象(event listener)
每个组件均可以针对特定的事件指定一个或多个事件倾听对象,由这些事件倾听对象负责处理事件。

AWT事件分类
EventObject--->AWTEvent-->ActionEvent
                       -->AdjustmentEvent
                       -->ComponentEvent--->ContainerEvent
                                        --->FocusEvent
                                        --->InputEvent
                                                        -->KeyEvent
                                                        --->MouseEvent
                                        --->PaintEvent
                                        --->WindowEvent
                       
                       -->IntemEvent
                       -->TextEvent
窗口事件
当一个窗口被激活,撤销激活,打开,关闭,最大化,最小化时,发生窗口事件。
从WindowEvent类中创建对象表示窗口事件。

不同事件类型的接口和方法
分类                 接口名                         方法
Action              ActionListener              actionPerformed(ActionEvent)
Item                ItemLisener                 itemStateChanged(ItemEvent)
Mouse Motion        MouseMotionListener         mouseDragged(MouseEvent)    mouseMoved(MouseEvent)
Mouse               MouseListener              mousePressed(MouseEvent) mouseReeased(MouseEvent) mouseEntered(MouseEvent) mouseEntered(MouseEvent)
mouseClicked(MouseEvent) mouseExited(MouseEvent)
Key                     KeyListener           keyPressed(KeyEvent)  keyReleassed(KeyEvent)
keyTyped(KeyEvent)
Focus                   FocusListener         focusGained(FocusEvent)  focusLost(FocusEvent)

不同事件类型的接口和方法
分类                       接口名                方法
Adjustment           AdjustmentListener     adjustmentValueChange(AdjustmentEvent)
Component            ComponentListener        componentMoved(ComponentEvent)  componentHiddent(ComponentEvent)
componntResized(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)

事件适配器(Adapater)
为简化编程,针对大多数事件监听器接口定义了相应的实现类---事件适配器类,在适配器类中,实现了相应监听器接口中所有的方法,但不做任何事情。
在定义监听器类时就可以继承事件适配器类,并只重写所需要的方法。

事件处理类的形式
利用内部类来处理事件
用匿名内部类处理事件
定义一个事件监听器类
直接在当前类中处理

创建菜单
创建一个菜单步骤:
-创建一个MenuBar对象,将其放置到菜单容器中(如 Frame)
-创建若干个Menu对象,将其放置到MenuBar对象中
-创建若干个MenuItem对象,将其放置到Menu对象中
MenuItem包括
-MenuItem:普通的菜单项
-CheckboxMenuItem:可以选择的菜单项

创建菜单
创建一个菜单步骤:
-创建一个MenuBar对象,将其放置到菜单容器中(如Fram)
-创建若干个Menu对象,将其放置到MenuBar对象中
-创建若干个MenuItem对象,将其放置到Menu对象中
MenuItem包括
-MenuItem:普通的菜单项
-CheckboxMenuItem:可以选择的菜单项

右键菜单
右键菜单使用PopupMenu对象表示,创建右键菜单步骤如下:
(1)创建PopupMenu的实例)
(2)创建多个MenuItem实例,依次将这些实例加入PopupMenu中。
(3)将PopupMenu加入到目标组件之中。
(4)为需要出现上下文菜单的组件编写鼠标监听器,当用户释放鼠标右键时弹出右键菜单。

在AWT中画图
通常,创建Canvas类或Panel的子类,并覆盖paint方法
每当组件出现时调用paintf方法
每个组件都有一个Graphics对象
Graphics类实现了很多绘图方法

AWT中的坐标
(00----------------------------------->x轴
|
|
|
|
|
|
|
|
|
>y轴

Graphics类
Graphics是一个抽象的画笔对象,Graphics可以在组件上绘制丰富多彩的几何图形和位图,Graphics类提供了如下几个方法用于绘制几何图形和位图:
-drawLine:绘制直线。
-drawString:绘制字符串。
-drawRect:绘制据矩形。
-drawRoundRect:绘制圆角矩形。
-drawOval:绘制椭圆形状。
-drawArc:绘制一段圆弧(可能是椭圆的圆弧)。
-deawPolyline:绘制折线。
-fillRect:填充一个矩形区域。
-fillRoundRect:填充一个圆角矩形区域。
-fillOval:填充椭圆区域
-fillPolygon:绘制一个多边形区域。
-fillArc:填充圆弧和圆弧两个端点到中心的连线所包围的区域。
-drawImage:绘制位图。

BufferedImage实现类
Image类代表了位图,但它是一个抽象类,无法直接创建Image对象,为此java为它提供了一个BufferedImage实现类,它是一个可访问图像数据缓冲区的Image实现类。该类提供了一个简单的构造器,用于创建一个BufferedImage对象:
 -BufferedImage(int width,int height,int imagType):创建指定大小,指定图像类型的BufferedImage对象,其中imageType可以是BufferedImage.TYPE_INT_RGB,BufferedImage.TYPE_BYTE_GRAY等值/
 除此之外,BufferedImage还提供了一个getGraphics()方法返回该对象的Graphics对象,从而允许通过该Graphics对象向Image中添加图形。
 借助于BufferedImage的帮助,我们可以在AWT中实现缓冲技术,当我们需要向GUI组件上绘制图形时,不要直接绘制到该GUI组件上,而是先将图形绘制到BufferedImage对象中,然后再调用组件的drawImage一次性地将BufferedImage对象绘制到特定组件上。

ImageIO输入/输出位图
ImageIol类并不能支持读写全部格式的图形文件,程序可以通过ImageIO类的如下几个静态方法来访问该类所支持读写的图形文件格式:
-getReaderFileSuffixes():返回一个String数组,该数组列出ImageIO所有能读的图形文件的文件后缀。
-getReaderFormatNames():返回一个Stri  ng数组,该数组列出ImageIO所有能读的图形文件的非正式格式名称。
-static String[]getWriterFileSuffixes():返回一个String数组,该数组列出ImageIO所有能读的图形文件de文件后缀。
-static String[] getWriterFormatNames():返回一个String数组,该数组列出ImageIOsu所有能写的图形文件的非正式格式名称。

剪贴板
AWT支持两种剪贴板:系统剪贴板和本地剪贴板,如果在同一个虚拟机的不同窗口之间进行数据传递,则无需使用系统剪贴板,使用虚拟机剪贴板就可以了。系统剪贴板与运行平台无关,可以传输任意格式的数据。

使用系统剪贴板
Clipboard clipboard=Toolkit.getDefaultToolkit().getSystemCliboard();
传递文本是最简单的情形,因为AWT已经提供了一个StringSelection用于传输文本字符串。
传递图片需要自己实现Transferable对象。
Transferable接口代表了可以放入剪贴板的传输对象,所以如果我们希望将图像放入剪贴板内,必须提供一个Transferable接口的实现类,该实现类其实很简单,它封装一个image对象,并且向外表现为imageFlavor的内容。

使用本地剪贴板
本地剪贴板可以保存任何类型的java对象。为了将任意类形的对象保存到剪贴板中,DataFlavor里提供了一个javaJVMLocalObjectMimeType的常量将java对象放入本地剪贴板必须使用MIME类型,该MIME类型表示仅将对象引用复制到剪贴板中,对象引用只有在同一个虚拟机中才有效,所以只能使用本地剪贴板。
创建本地剪贴板的代码如下:
-Clipboard clipboard=new Clipboard("cp");
java并没有提供封装对象引用的Transferable实现类,因此我们必须实现接口,实现该接口与前面的ImageSelect基本相似,一样要实现该接口的三个方法,并持有某个对象的引用。

使用系统剪贴板传递java对象
系统剪贴板不仅支持传输文本,图像的基本内容,也可以传输支持序列化的java对象和远程对象,复制到剪贴板中序列化java对象和远程对象可以使用另外一个java程序(不在同一个虚拟机中的程序)来读取。DataFlavor中提供了javaSerializedObjectMimeType,javaRemoteObjectMimeType两个字符串常量来表示序列化java对象和远程对象的MIME类型,这两种MIME类型提供了复制对象MIME类型,这两种MIME类型提供了复制对象,读取对象所包含的复杂操作,程序只需要创建对应的Transferable实现类即可。

使用系统剪贴板传递java对象需要实现SerialSelection类,该类与前面的ImageSelection,LocalSelection实现类相似,都需要实现Tranferable接口,实现该接口的三个方法,并持有一个可序列化的对象。


                    	











 




















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值