javaGUI学习41:Swing-边框、图标和动作

边框绘制在组件的边界周围,它有许多不同的种类:线边框、雕刻边框、不光滑的边框等等。边框本身不是组件,所以,它们绘制在指定组件的边衬中。

图标是图形对象,通常是一个小图像。与边框一样,图标在指定组件的指定位置上绘制。动作封装图形用户界面的一个逻辑操作,并且还简化用户界面元素的构造工作。

动作通常由一个或多个图标或文本字符串组成。可以把动作添加到某些容器中,这些容器创建一个组件与这个动作相关联。例如,利用JMenu . audd (Action)方法,可把动作添加到一个菜单中。当一个动作添加到一个菜单中时,这个菜单用与这个动作相关联的文本和图标来创建一个菜单项并·把这个菜单项添加到莱单中。

1、边框

通过构造所需类型的边框,然后把这个边框传送给JComponent . setBorder ( Border)所有JComponent扩展(JViewport除外)都可以有边框。虽然每个组件可以只有一个边框,但Swing支持组合边框,因此,在实际应用中,单个组件可以使数个边框嵌套在一起,使边框有一定的深度。

1.1 边框和边衬

AWT容器有一个insets 属性,它定义容器的边衬。布局管理器仔细地布局一个容器中的各个组件,以便这些组件不会侵占这个容器的边衬区。容器的insets 属性是一个只读属性,修改AWT容器in-sets属性唯一的方法是子类化一个容器并重载它的getInsets方法。

除JViewport(它不允许自已有一个边框))外,Swing 组件不需要重载getInsets ()来定义一个边衬区。相反,如果在组件的边缘有空着的空间,则Swing 组件使用一个空边框。当请求Swing 组件的边衬时,Swing组件返回它们边框的边衬。如果一个Swing组件确实没有边框,只有这时,Swing 组件才会返回由其超类java .awt . Container维护的insets属性。

1.2 Swing的边框类型
边框类型 描述 不透明 相关常量
雕刻 一个3D边框 RAISED,LOWERED
组合 含有一个内部边框和一个外部边框 变化 n/a
一个不用绘制的透明边框 不是 n/a
蚀刻 一个蚀刻的透明边框 RAISED,LOWERED
线 可设置宽度的有颜色的单线边框 n/a
不光滑 一种边框,它在边框的空白处填充一种颜色或在边框的空白处平铺一幅图像 n/a
软雕刻 有软角的雕刻边框 不是 RAISED,LOWERED
带标题 带有标题的边框。标题的位置是可设置 不是 DEFAULT_POWITION,
ABOVE_TOP,TOP,
BELOW_TOP,
BELOW_TOP,
ABOVE_BOTTOM
BOTTOM
BELOW_BOTTOM
DEFAULT_JUSTFICATION
LEFT,CENTED,RIGHT

每种边框对应swing.border包中的一个类,

这些边框都是BorderFactory类创建的,处理软雕刻边框外(new SofeBevelBorder)

1.3 不透明与透明之间的比较

与Swing轻量组件一样,边框设计成不透明的或部分透明的。只有当边框绘制每一个像素点时,这个边框才是不透明的;如果边框未能绘制每个像素点甚至就是没有绘制一个像素点,则这个边框就不是不透明的。

1.4 边框包

与Swing边框有关的所有类(BorderFactory类除外)都在swing.border包中。这个包包括一个Border接口、一个 AbstractBorder类和许多与边框类型相对应的具体的边框类。

1.5 边框接口

所有的边框都实现Border接口。

1.6 AbstractBorder类

所有的Swing边框都扩展实现Border接口的 AbstractBorder类。AbstractBorder实现绘制边框、返回边衬和指出边框是否是不透明的等缺省功能。

1.7 边框库

因为边框以要绘制边框的组件为参数,所以单个边框可以用于装饰多个组件。事实上,Swing包提供了一个BorderFactory类,它构造共享边框实例。

1.8 替换内置边框

因为内置边框在不同的界面样式中是不同的,所以不存在一个包含内置边框的组件的完全列表。如果为一个组件指定一个边框,最好在各种不同的界面样式中测试这个边框以确保这个边框不会破坏这个组件的界面样式特征。

1.9 实现定制边框

与缺省的Swing 边框一样,定制边框应该扩展AbstractBorder类并有选择地重载它的方法。通常,这意味着重载paintBorder和 getBorderlnsets,因为AbstractBorder不绘制并且返回一个(0,0,0,0)边衬。另外,如果定制边框要绘制边框中的每一个像素点的话,则这个定制边框应该重载isOpaque ()方法以返回true。缺省时,AbstractBorder 不是不透明的

2、图标

在概念上,图标与边框非常相似,图标和边框都绘制到通常与一个组件相关联的Graphics中。接口lcon。

2.1 把图标与组件关联

菜单项用一个图标来构造。当绘制菜单项时,每个菜单项的图标绘制到菜单项所占据的区域中。许多Swing 组件(如下所列)都可以显示图标。

JButton、JCheckBox、JCheckBoxMenultem、JFileChooser、、JLabel、JList、JMenultem、JOptionPane、JPopupMenu、JRdioButton、JTable、JToolBar
2.2 组件*享图标

许多支持显示图标的组件可以共享图标

2.3 图像图标

Swing 提供Icon接口的-一-个实现,即 lmagelcon类

Imagelcon采用前一种方法——当一幅图像被指定时(不论在构造时还是在构造后的任何时间),就调用MediaTracker的一个实例以便完全装载这幅图像。图像装载封装在protected lmageIcon. loarllmage方法中,因此,如果需要,Imagelcon 的扩展可任意修改缺省图像装载政策。因为Imagelcon同步地装载图像,所以建议使用小图像。
如果在装载过程中发生了一个错误,则由图像图标维护的图像设置为null,接着调用的paintlcon ()并不产生任何操作,而且对getIconWidth ()和getlconHeight()的调用将返回-1。图像装载的状态可以通过调用getImageloadStatus ()来获取,getImageLoadStatus ()返回一个MediaTracker常量。

2.4 动画的图像图标

虽然图像图标能被MediaTracker的一个实例完全装载,但是,多帧的图像需要一个图像观察器以便显示图像连续的帧。有关图像观察器在多帧图像中的作用的更多信息,请参见《Java 2图形设计,卷Ⅰ: AWT》。
如果通过调用lmagelcon.setlmageObserver ()没有为一个图像图标显式地设置一个图像观察器,则把传送给图标的 paintlcon方法的组件作为图像观察器。因为java.awt. Component 是一个能够绘制多帧图像的图像观察器,所以动画的图像会由Imagelcon类自动处理。

3、动作

动作封装一个与小应用程序或应用程序有关的基础操作。动作除维护一个或多个值(通常是图标和/或字符串)外,还维护一个允许状态。一个动作的基本功能由swing.Action接口来定义。

3.1 作为控制中心点的动作

动作也只是用来创建菜单项。然而,动作真正的价值(与图标一样)是它们具有与多个组件相关联的能力。
如前所述,动作维护一个允许状态,而且可以激发属性变化事件。另外,单个动作可以与多个Swing组件相关联。当一-个动作被启用或禁用时,它发送一个属性变化事件给与之相关联的所有组件。这些组件依次设置它们的允许状态以便与这个动作的状态一致。因此,动作可以被用来作为退出小应用程序、打开一个新文档、剪切和粘贴等逻辑操作的一个控制点。

3.2 动作常量
方法 含义 对象类型
NAME 在Swing组件中显示的一个自符串 字符串
SMALL_ICON 在Swing组件中显示的一个图标 图标
DEFAULT 已定义的实现 已定义的实现
LONG_DESCRIPTION 已定义的实现 字符串
SHOORT_DESCRIPTION 已定义的实现 字符串
上一篇:JavaGUI 05 事件监听&&解决中文乱码


下一篇:javaGUI 简单实现切换面板背景颜色