- 直接已知的子类:
-
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
-
Method Summary
Modifier and TypeMethodDescription返回外观和感觉的默认值。abstract String
返回此外观和感觉实现的一行描述,例如。static Object
getDesktopPropertyValue
(String systemPropertyName, Object fallbackValue) 通过调用Toolkit.getDefaultToolkit().getDesktopProperty()
返回指定系统桌面属性的值。getDisabledIcon
(JComponent component, Icon icon) 返回一个禁用外观的Icon
。getDisabledSelectedIcon
(JComponent component, Icon icon) 返回供已选择的禁用组件使用的Icon
。abstract String
getID()
返回标识此外观和感觉的字符串。返回此外观和感觉的LayoutStyle
。abstract String
getName()
返回标识此外观和感觉的简短字符串,例如。boolean
如果LookAndFeel
返回的RootPaneUI
实例支持在JRootPane
中提供Window
装饰,则返回true
。void
初始化外观和感觉。static void
installBorder
(JComponent c, String defaultBorderName) 用默认值设置组件的边框属性的便利方法。static void
installColors
(JComponent c, String defaultBgName, String defaultFgName) 用默认值设置组件的前景和背景颜色属性的便利方法。static void
installColorsAndFont
(JComponent c, String defaultBgName, String defaultFgName, String defaultFontName) 用默认值设置组件的前景、背景和字体属性的便利方法。static void
installProperty
(JComponent c, String propertyName, Object propertyValue) 如果开发人员尚未设置属性,则在组件上安装具有指定名称和值的属性的便利方法。abstract boolean
如果底层平台具有“本机”外观和感觉,并且这是其实现之一,则返回true
。abstract boolean
如果底层平台支持或允许此外观和感觉,则返回true
。static void
loadKeyBindings
(InputMap retMap, Object[] keys) 使用指定的绑定填充InputMap
的便利方法。static ComponentInputMap
makeComponentInputMap
(JComponent c, Object[] keys) 从keys
创建一个ComponentInputMapUIResource
。static Object
创建并返回一个加载图像的UIDefault.LazyValue
。static InputMap
makeInputMap
(Object[] keys) 从keys
创建一个InputMapUIResource
。static JTextComponent.KeyBinding[]
makeKeyBindings
(Object[] keyBindingList) 构建KeyBindings
数组的便利方法。void
provideErrorFeedback
(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
返回显示和标识此对象属性的字符串。
-