- 已知子类:
BasicLookAndFeel,MultiLookAndFeel
LookAndFeel 顾名思义,封装了外观。除了安装外观之外,大多数开发人员从不需要直接与 LookAndFeel 交互。通常,只有创建自定义外观的开发人员才需要关心此类。
Swing 建立在每个JComponent 子类都有一个特定ComponentUI 子类的实现的基础上。 ComponentUI 通常被称为“ui”、“组件 ui”或“外观委托”。 ComponentUI 子类负责提供组件的外观特定功能。例如,JTree 需要 ComponentUI 子类 TreeUI 的实现。具体 ComponentUI子类的实现由LookAndFeel提供。每个 JComponent 子类通过 JComponent 方法 getUIClassID 标识它需要的 ComponentUI 子类。
每个 LookAndFeel 实现必须通过在从 getDefaults 返回的 UIDefaults 对象中为每个 Swing 的 ui 类 ID 指定一个值来提供适当的 ComponentUI 子类的实现。例如,BasicLookAndFeel 使用 BasicTreeUI 作为 TreeUI 的具体实现。这是通过 BasicLookAndFeel 在从 getDefaults 返回的 UIDefaults 中提供键值对 "TreeUI"-"javax.swing.plaf.basic.BasicTreeUI" 来实现的。参考UIDefaults.getUI(JComponent) 获取ComponentUI子类的实现的详细信息。
安装 LookAndFeel 后,UIManager 不会检查是否存在所有 ui 类 ID 的条目。因此,如果当前外观未提供特定 ui 类 ID 的值并且创建了 JComponent 子类的实例,则会发生随机异常。
外观和感觉建议
正如UIManager 中所述,每个 LookAndFeel 都有机会提供一组默认值,这些默认值与开发人员和系统默认值分层。某些 Swing 组件需要外观来提供一组特定的默认值。这些记录在需要特定默认值的类中。
ComponentUI 和默认值
所有ComponentUIs 通常需要在 JComponent 上设置各种属性,ComponentUI 为其提供外观。这通常在 ComponentUI 安装在 JComponent 上时完成。仅当开发人员未设置属性时才应设置属性。对于非原始值,建议 ComponentUI 仅在当前值为 null 或实现 UIResource 时更改 JComponent 上的属性。如果当前值为 null 或 implements UIResource,则表示该属性尚未被开发者设置,用户界面可以随意更改。例如,如果 button.getFont() 的返回值是 null 或实现 UIResource,则 BasicButtonUI.installDefaults 仅更改 JButton 上的字体。另一方面,如果 button.getFont() 返回一个没有实现 UIResource 的 non-null 值,那么 BasicButtonUI.installDefaults 将不会更改 JButton 的字体。
对于原始值,例如 opaque ,应调用方法 installProperty。 installProperty 仅在开发人员未更改值的情况下更改相应的属性。
ComponentUI 实现应该使用此类提供的各种安装方法,因为它们处理必要的检查并使用推荐的指南安装属性。
异常
如果被更改的属性值为null 或 UIResource ,则 LookAndFeel 提供的所有安装方法都需要访问默认值。例如,安装字体会执行以下操作:
JComponent c;
Font font = c.getFont();
if (font == null || (font instanceof UIResource)) {
c.setFont(UIManager.getFont("fontKey"));
}
如果字体是 null 或 UIResource,则使用关键字 fontKey 查询默认表。如果传入 null,所有 UIDefault's get 方法都会抛出 NullPointerException。因此,除非另有说明,如果当前值为 null 或 UIResource 并且提供的默认键为 null ,则 LookAndFeel 的各种安装方法中的每一个都会抛出 NullPointerException 。此外,除非另有说明,否则所有 install 方法都会在传入 null 组件时抛出 NullPointerException。
- 自从:
- 1.2
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述返回外观默认值。abstract String返回此外观实现的单行描述,例如static ObjectgetDesktopPropertyValue(String systemPropertyName, Object fallbackValue) 通过调用Toolkit.getDefaultToolkit().getDesktopProperty()返回指定系统桌面属性的值。getDisabledIcon(JComponent component, Icon icon) 返回具有禁用外观的Icon。getDisabledSelectedIcon(JComponent component, Icon icon) 返回一个Icon供同时被选中的禁用组件使用。abstract StringgetID()返回标识此外观的字符串。返回此外观的LayoutStyle。abstract StringgetName()返回标识此外观的短字符串,例如boolean如果LookAndFeel返回RootPaneUI实例支持在JRootPane中提供Window装饰,则返回true。void初始化外观。static voidinstallBorder(JComponent c, String defaultBorderName) 使用默认值设置组件边框属性的便捷方法。static voidinstallColors(JComponent c, String defaultBgName, String defaultFgName) 使用默认值设置组件的前景色和背景色属性的便捷方法。static voidinstallColorsAndFont(JComponent c, String defaultBgName, String defaultFgName, String defaultFontName) 使用默认值设置组件的前景、背景和字体属性的便捷方法。static voidinstallProperty(JComponent c, String propertyName, Object propertyValue) 用于在组件上安装具有指定名称和值的属性(如果开发人员尚未设置该属性)的便捷方法。abstract boolean如果底层平台具有“本机”外观,并且这是它的一个实现,则返回true。abstract boolean如果底层平台支持和/或允许这种外观,则返回true。static voidloadKeyBindings(InputMap retMap, Object[] keys) 使用指定的绑定填充InputMap。static ComponentInputMapmakeComponentInputMap(JComponent c, Object[] keys) 从keys创建一个ComponentInputMapUIResource。static Object创建并返回加载图像的UIDefault.LazyValue。static InputMapmakeInputMap(Object[] keys) 从keys创建一个InputMapUIResource。static JTextComponent.KeyBinding[]makeKeyBindings(Object[] keyBindingList) 构建KeyBindings数组的便捷方法。voidprovideErrorFeedback(Component component) 当用户尝试无效操作时调用,例如粘贴到具有焦点的不可编辑的JTextField中。toString()返回显示和标识此对象属性的字符串。void取消初始化外观。static void卸载边框的便捷方法。
-
构造方法详细信息
-
LookAndFeel
protected LookAndFeel()子类调用的构造方法。
-
-
方法详情
-
installColors
使用默认值设置组件的前景色和背景色属性的便捷方法。仅当当前值为null或UIResource时才设置属性。- 参数:
c- 设置颜色的组件defaultBgName- 背景键defaultFgName- 前景键- 抛出:
NullPointerException- 如 异常 所述- 参见:
-
installColorsAndFont
public static void installColorsAndFont(JComponent c, String defaultBgName, String defaultFgName, String defaultFontName) 使用默认值设置组件的前景、背景和字体属性的便捷方法。仅当当前值为null或UIResource时才设置属性。- 参数:
c- 组件设置为颜色和字体defaultBgName- 背景键defaultFgName- 前景键defaultFontName- 字体键- 抛出:
NullPointerException- 如 异常 所述- 参见:
-
installBorder
使用默认值设置组件边框属性的便捷方法。仅当边框为null或UIResource的实例时才设置边框。- 参数:
c- 设置边框的组件defaultBorderName- 指定边框的键- 抛出:
NullPointerException- 如 异常 所述
-
uninstallBorder
卸载边框的便捷方法。如果组件的边框是UIResource,则它被设置为null。- 参数:
c- 要卸载边框的组件- 抛出:
NullPointerException- 如果c是null
-
installProperty
用于在组件上安装具有指定名称和值的属性(如果开发人员尚未设置该属性)的便捷方法。此方法旨在供 ui 委托实例使用,这些实例需要为基本类型(boolean、int、..)的属性指定默认值,但不希望覆盖客户端设置的值。由于原始属性值不能用UIResource标记包装,因此此方法使用私有状态来确定该属性是否已被客户端设置。- 参数:
c- 设置属性的目标组件propertyName- 要设置的属性的名称propertyValue- 属性值- 抛出:
IllegalArgumentException- 如果指定的属性不是可以使用此方法设置的属性ClassCastException- 如果开发人员未设置属性值并且类型与属性的类型不匹配NullPointerException- 如果c是null,或者命名属性尚未由开发人员设置并且propertyValue是null- 自从:
- 1.5
-
makeKeyBindings
构建KeyBindings数组的便捷方法。虽然此方法未被弃用,但开发人员应改为使用ActionMap和InputMap来提供键绑定。此方法返回一个
KeyBindings数组,一个对应于keyBindingList中的每个交替key-action对。key可以是KeyStroke.getKeyStroke方法指定格式的String,也可以是KeyStroke。该对的action部分是一个String,对应于Action的名称。以下示例说明了从六个交替的
key-action对创建一个KeyBinding数组:JTextComponent.KeyBinding[] multilineBindings = makeKeyBindings( new Object[] { "UP", DefaultEditorKit.upAction, "DOWN", DefaultEditorKit.downAction, "PAGE_UP", DefaultEditorKit.pageUpAction, "PAGE_DOWN", DefaultEditorKit.pageDownAction, "ENTER", DefaultEditorKit.insertBreakAction, "TAB", DefaultEditorKit.insertTabAction });如果keyBindingList's长度为奇数,则忽略最后一个元素。为
key-action对的key或action部分提供null值会导致创建具有相应值null的KeyBinding。由于 Swing 的其他部分期望KeyBinding中的non-null值,您应该避免提供null作为key-action对的key或action部分。- 参数:
keyBindingList-key-action对的数组- 返回:
KeyBindings数组- 抛出:
NullPointerException- 如果keyBindingList是nullClassCastException- 如果对的key部分不是KeyStroke或String,或者对的action部分不是String- 参见:
-
makeInputMap
从keys创建一个InputMapUIResource。这是创建新InputMapUIResource、调用loadKeyBindings(map, keys)并返回InputMapUIResource的便捷方法。- 参数:
keys- 交替成对的keystroke-action key对,如loadKeyBindings(javax.swing.InputMap, java.lang.Object[])中所述- 返回:
-
新创建和填充
InputMapUIResource - 自从:
- 1.3
- 参见:
-
makeComponentInputMap
从keys创建一个ComponentInputMapUIResource。这是创建新ComponentInputMapUIResource、调用loadKeyBindings(map, keys)并返回ComponentInputMapUIResource的便捷方法。- 参数:
c- 创建ComponentInputMapUIResource的组件keys- 交替成对的keystroke-action key对,如loadKeyBindings(javax.swing.InputMap, java.lang.Object[])中所述- 返回:
-
新创建和填充
InputMapUIResource - 抛出:
IllegalArgumentException- 如果c是null- 自从:
- 1.3
- 参见:
-
loadKeyBindings
使用指定的绑定填充InputMap。绑定以交替keystroke-action key对列表的形式提供。keystroke是KeyStroke的实例,或者是标识KeyStroke用于绑定的String。具体格式参考KeyStroke.getKeyStroke(String)。该对的action key部分是在InputMap中为KeyStroke注册的密钥。下面说明了用两个
key-action对加载一个InputMap:LookAndFeel.loadKeyBindings(inputMap, new Object[] { "control X", "cut", "control V", "paste" });提供
null绑定列表 (keys) 不会以任何方式更改retMap。指定
nullaction key会导致从InputMap中删除keystroke's条目。nullkeystroke被忽略。- 参数:
retMap-InputMap添加key-action对keys- 要添加到retMap的绑定- 抛出:
NullPointerException- 如果keys是non-null,不为空,并且retMap是null- 自从:
- 1.3
- 参见:
-
makeIcon
创建并返回加载图像的UIDefault.LazyValue。返回值是UIDefaults.LazyValue的实现。当对返回的对象调用createValue时,将加载图像。如果图像是non-null,则它会被包裹在实现UIResource的Icon中。使用Class.getResourceAsStream(gifFile)加载图像。此方法不以任何方式检查参数。强烈建议提供
non-null值,否则在返回对象上调用createValue时可能会发生异常。- 参数:
baseClass-Class用于加载资源gifFile- 要加载的图像的路径- 返回:
-
一个
UIDefaults.LazyValue;当解析LazyValue加载指定的图像 - 参见:
-
getLayoutStyle
返回此外观的LayoutStyle。这永远不会返回null。您通常不会从外观上使用
LayoutStyle,而是使用LayoutStyle方法getInstance。- 返回:
-
这个外观的
LayoutStyle - 自从:
- 1.6
- 参见:
-
provideErrorFeedback
当用户尝试无效操作时调用,例如粘贴到具有焦点的不可编辑的JTextField中。默认实现发出蜂鸣声。希望不同行为的子类应该覆盖它并提供额外的反馈。- 参数:
component-Component错误发生在,可能是null指示错误条件与Component没有直接关联- 自从:
- 1.4
-
getDesktopPropertyValue
通过调用Toolkit.getDefaultToolkit().getDesktopProperty()返回指定系统桌面属性的值。如果指定属性的值为null,则返回fallbackValue。- 参数:
systemPropertyName- 被查询的系统桌面属性的名称fallbackValue- 如果系统值为 null,则作为值返回的对象- 返回:
- 桌面属性的当前值
- 自从:
- 1.4
- 参见:
-
getDisabledIcon
返回具有禁用外观的Icon。此方法用于在未指定时生成禁用的Icon。例如,如果您创建一个JButton并且仅通过setIcon指定一个Icon将调用此方法来生成禁用的Icon。如果null作为icon传递,此方法返回null。某些外观可能不会呈现禁用的
Icon,在这种情况下,它们将忽略它。- 参数:
component-JComponent将显示Icon,可能是nullicon-Icon从中生成禁用图标- 返回:
-
禁用
Icon或null如果无法生成合适的Icon - 自从:
- 1.5
-
getDisabledSelectedIcon
返回一个Icon供同时被选中的禁用组件使用。此方法用于为同时处于禁用和选中状态但没有针对此状态的特定Icon的组件生成Icon。例如,如果您创建一个JButton并且仅通过setIcon指定一个Icon,则将调用此方法来生成禁用和选定的Icon。如果null作为icon传递,此方法返回null。某些外观可能不会呈现禁用和选定的
Icon,在这种情况下,它们将忽略它。- 参数:
component-JComponent将显示Icon,可能是nullicon-Icon从中生成禁用和选定的图标- 返回:
-
禁用并选中图标,或者如果无法生成合适的
Icon,则为null。 - 自从:
- 1.5
-
getName
返回标识此外观的短字符串,例如“CDE/Motif”。该字符串应该适用于菜单项。不同的外观和感觉应该有不同的名称,例如,改变一些组件呈现方式的 MotifLookAndFeel 的子类应该称为“CDE/Motif My Way”;对试图从名称列表中选择 L&F 的用户有用的东西。- 返回:
- 外观的简短标识符
-
getID
返回标识此外观的字符串。该字符串将由想要识别众所周知的外观实现的应用程序/服务使用。目前众所周知的名称是“Motif”、“Windows”、“Mac”、“Metal”。请注意,派生自未对外观进行任何根本更改的众所周知的超类的 LookAndFeel 不应重写此方法。- 返回:
- 外观的标识符
-
getDescription
返回此外观实现的单行描述,例如“The CDE/Motif Look and Feel”。该字符串供用户使用,例如在窗口标题或工具提示消息中。- 返回:
- 外观的简短描述
-
getSupportsWindowDecorations
public boolean getSupportsWindowDecorations()如果LookAndFeel返回RootPaneUI实例支持在JRootPane中提供Window装饰,则返回true。默认实现返回
false,支持Window装饰的子类应该覆盖它并返回true。- 返回:
true如果此外观创建的RootPaneUI实例支持客户端装饰- 自从:
- 1.4
- 参见:
-
isNativeLookAndFeel
public abstract boolean isNativeLookAndFeel()如果底层平台具有“本机”外观,并且这是它的一个实现,则返回true。例如,当底层平台是运行 CDE 的 Solaris 时,CDE/Motif 外观实现将返回true。- 返回:
true如果此外观代表底层平台外观
-
isSupportedLookAndFeel
public abstract boolean isSupportedLookAndFeel()如果底层平台支持和/或允许这种外观,则返回true。如果外观取决于未为当前平台定义的特殊资源或法律协议,则此方法返回false。- 返回:
true如果这是受支持的外观- 参见:
-
initialize
public void initialize()初始化外观。虽然此方法是公共的,但只有在将外观安装为当前外观时,UIManager才能调用它。此方法在UIManager调用getDefaults之前被调用。此方法旨在为外观执行任何初始化。子类应该在此处执行它们需要的任何一次性设置,而不是在静态初始化程序中,因为加载外观类对象可能只是为了发现isSupportedLookAndFeel()返回false。- 参见:
-
uninitialize
public void uninitialize()取消初始化外观。虽然此方法是公共的,但它只能在外观被卸载时由UIManager调用。例如,UIManager.setLookAndFeel在外观和感觉发生变化时调用它。子类可以选择在这里释放一些资源。
- 参见:
-
getDefaults
返回外观默认值。虽然此方法是公共的,但只有当外观设置为当前外观时以及调用initialize后,它才应由UIManager调用。- 返回:
- 外观默认
- 参见:
-
toString
返回显示和标识此对象属性的字符串。
-