- 直接已知的子类:
-
BasicLookAndFeel,MultiLookAndFeel
LookAndFeel,顾名思义,封装了外观和感觉。除了安装外观和感觉之外,大多数开发人员不需要直接与LookAndFeel交互。一般来说,只有创建自定义外观和感觉的开发人员才需要关注这个类。
Swing建立在每个JComponent子类都有一个特定ComponentUI子类的实现的基础上。ComponentUI通常被称为“ui”,“组件ui”或“外观和感觉代理”。ComponentUI子类负责提供组件的外观和感觉特定功能。例如,JTree需要TreeUI的实现作为ComponentUI子类。具体的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"来实现的。有关如何获取ComponentUI子类的实现的详细信息,请参阅UIDefaults.getUI(JComponent)。
当安装LookAndFeel时,UIManager不会检查是否存在所有ui类id的条目。因此,如果当前外观和感觉没有为特定ui类id提供值并且创建了JComponent子类的实例,将会发生随机异常。
外观和感觉的建议
如UIManager中所述,每个LookAndFeel都有机会提供一组默认值,这些默认值与开发人员和系统默认值一起叠加。一些Swing的组件需要外观和感觉提供特定的一组默认值。这些在需要特定默认值的类中有记录。
ComponentUIs和默认值
所有ComponentUIs通常需要在为其提供外观和感觉的JComponent上设置各种属性。通常在将ComponentUI安装在JComponent上时执行此操作。只有在开发人员未设置属性时才应设置属性。对于非原始值,建议ComponentUI仅在当前值为null或实现UIResource时才更改JComponent上的属性。如果当前值为null或实现UIResource,则表示开发人员尚未设置属性,ui可以自由更改它。例如,BasicButtonUI.installDefaults仅在button.getFont()的返回值为null或实现UIResource时才更改JButton的字体。另一方面,如果button.getFont()返回一个未实现UIResource的非null值,则BasicButtonUI.installDefaults将不会更改JButton的字体。
对于原始值,例如opaque,应调用installProperty方法。只有在开发人员未更改值时,installProperty才会更改相应的属性。
ComponentUI实现应使用此类提供的各种安装方法,因为它们处理必要的检查并使用推荐的准则安装属性。
异常
LookAndFeel提供的所有安装方法需要访问默认值,如果要更改的属性的值为null或UIResource。例如,安装字体执行以下操作:
JComponent c;
Font font = c.getFont();
if (font == null || (font instanceof UIResource)) {
c.setFont(UIManager.getFont("fontKey"));
}
如果字体为null或UIResource,则使用键fontKey查询默认表。如果传递null,则UIDefault的所有get方法都会抛出NullPointerException。因此,除非另有说明,LookAndFeel的各种安装方法如果当前值为null或UIResource且提供的默认键为null,则会抛出NullPointerException。此外,除非另有说明,如果传递了null组件,则所有install方法都会抛出NullPointerException。
- 自版本:
- 1.2
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription返回外观和感觉的默认值。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卸载边框的便利方法。
-
Constructor Details
-
LookAndFeel
protected LookAndFeel()子类调用的构造函数。
-
-
Method Details
-
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
安装指定名称和值的属性到组件上的便利方法,如果该属性尚未被开发人员设置。此方法旨在供需要为原始类型(boolean、int 等)的属性指定默认值但不希望覆盖客户端设置的 UI 代理实例使用。由于原始属性值无法使用UIResource标记进行包装,因此此方法使用私有状态来确定开发人员是否已设置属性。- 参数:
-
c- 要在其上设置属性的目标组件 -
propertyName- 要设置的属性的名称 -
propertyValue- 属性的值 - 抛出:
-
IllegalArgumentException- 如果指定的属性不是可以使用此方法设置的属性 -
ClassCastException- 如果开发人员尚未设置属性值且类型与属性的类型不匹配 -
NullPointerException- 如果c为null,或者命名属性尚未被开发人员设置且propertyValue为null - 自 JDK 版本:
- 1.5
-
makeKeyBindings
构建KeyBindings数组的便利方法。虽然此方法未被弃用,但开发人员应该改用ActionMap和InputMap来提供键绑定。此方法返回一个
KeyBindings数组,每个数组元素对应于keyBindingList中交替的key-action对。一个key可以是由KeyStroke.getKeyStroke方法指定格式的String,或者是一个KeyStroke。对于对中的action部分是与Action的名称对应的String。以下示例说明了如何从六个交替的
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的长度为奇数,则忽略最后一个元素。为
key或action部分提供null值将导致创建一个具有相应值null的KeyBinding。由于 Swing 的其他部分期望KeyBinding中有non-null值,因此应避免将null作为key或action部分提供给key-action对。- 参数:
-
keyBindingList- 一个key-action对数组 - 返回:
-
一个
KeyBindings数组 - 抛出:
-
NullPointerException- 如果keyBindingList为null -
ClassCastException- 如果对中的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 - 自 JDK 版本:
- 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 - 自 JDK 版本:
- 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。指定一个
null的action key将导致从InputMap中删除keystroke的条目。忽略null的keystroke。- 参数:
-
retMap- 要添加key-action对的InputMap -
keys- 要添加到retMap的绑定 - 抛出:
-
NullPointerException- 如果keys为non-null、非空且retMap为null - 自 JDK 版本:
- 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 - 自 JDK 版本:
- 1.6
- 参见:
-
provideErrorFeedback
当用户尝试执行无效操作时调用,例如将内容粘贴到具有焦点的不可编辑的JTextField中。默认实现会发出哔哔声。希望有不同行为的子类应该覆盖此方法并提供额外的反馈。- 参数:
-
component- 发生错误的Component,可能为null,表示错误条件与Component无直接关联 - 自从:
- 1.4
-
getDesktopPropertyValue
通过调用Toolkit.getDefaultToolkit().getDesktopProperty()返回指定系统桌面属性的值。如果指定属性的值为null,则返回fallbackValue。- 参数:
-
systemPropertyName- 正在查询的系统桌面属性的名称 -
fallbackValue- 如果系统值为null,则返回的对象 - 返回:
- 桌面属性的当前值
- 自从:
- 1.4
- 另请参阅:
-
getDisabledIcon
返回一个具有禁用外观的Icon。当未指定Icon时,此方法用于生成禁用的Icon。例如,如果创建一个JButton并且只通过setIcon指定一个Icon,则将调用此方法生成禁用的Icon。如果将null作为icon传递,则此方法返回null。某些外观和感觉可能不会呈现禁用的
Icon,在这种情况下,它们将忽略此操作。- 参数:
-
component- 将显示Icon的JComponent,可能为null -
icon- 用于生成禁用图标的Icon - 返回:
-
禁用的
Icon,如果无法生成合适的Icon,则返回null - 自从:
- 1.5
-
getDisabledSelectedIcon
返回一个用于同时禁用和选定组件的Icon。此方法用于为处于禁用和选定状态但没有特定Icon的组件生成Icon。例如,如果创建一个JButton并且只通过setIcon指定一个Icon,则将调用此方法生成禁用和选定的Icon。如果将null作为icon传递,则此方法返回null。某些外观和感觉可能不会呈现禁用和选定的
Icon,在这种情况下,它们将忽略此操作。- 参数:
-
component- 将显示Icon的JComponent,可能为null -
icon- 用于生成禁用和选定图标的Icon - 返回:
-
禁用和选定的图标,如果无法生成合适的
Icon,则返回null - 自从:
- 1.5
-
getName
返回一个简短的字符串,用于标识此外观,例如"CDE/Motif"。此字符串应适用于菜单项。不同的外观应该有不同的名称,例如更改了一些组件呈现方式的MotifLookAndFeel子类应该称为"CDE/Motif My Way";对于尝试从名称列表中选择L&F的用户有用的内容。- 返回:
- 外观的简短标识符
-
getID
返回一个标识此外观的字符串。此字符串将被希望识别知名外观实现的应用程序/服务使用。目前,知名名称为"Motif"、"Windows"、"Mac"、"Metal"。请注意,从不对外观进行基本更改的知名超类派生的LookAndFeel不应覆盖此方法。- 返回:
- 外观的标识符
-
getDescription
返回此外观实现的一行描述,例如"CDE/Motif外观"。此字符串适用于用户,例如在窗口标题或工具提示消息中。- 返回:
- 外观的简短描述
-
getSupportsWindowDecorations
public boolean getSupportsWindowDecorations()如果LookAndFeel返回的RootPaneUI实例支持在JRootPane中提供Window装饰,则返回true。默认实现返回
false,支持Window装饰的子类应该覆盖此方法并返回true。- 返回:
-
如果此外观创建的
RootPaneUI实例支持客户端装饰,则返回true - 自从:
- 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
返回外观的默认值。虽然此方法是公共的,但应该仅在UIManager将外观设置为当前外观并在调用initialize之后才调用。- 返回:
- 外观的默认值
- 另请参阅:
-
toString
返回显示和标识此对象属性的字符串。
-