java.lang.Object javax.swing.LookAndFeel
public abstract class LookAndFeel
顾名思义,LookAndFeel
封装了一个外观。除了安装外观之外,大多数开发人员无需直接与 LookAndFeel
进行交互。通常,只有创建自定义外观的开发人员才需要涉及此类。
Swing 构建的基础是每个 JComponent
子类都具有特定 ComponentUI
子类的实现。ComponentUI
通常被称为“ui”、“组件 ui”或“外观委托”。ComponentUI
子类负责提供组件特定于外观的功能。例如,JTree
需要 ComponentUI
子类 TreeUI
的实现。特定 ComponentUI
子类的实现由 LookAndFeel
提供。通过 JComponent
方法 getUIClassID
,每个 JComponent
子类可标识所需的 ComponentUI
子类。
每个 LookAndFeel
实现必须提供适当 ComponentUI
子类的实现,方法是为 getDefaults
所返回的 UIDefaults
对象中每个 Swing 的 ui 类 id 指定一个值。例如,BasicLookAndFeel
将 BasicTreeUI
用作 TreeUI
的具体实现。这是通过提供键-值对 "TreeUI"-"javax.swing.plaf.basic.BasicTreeUI"
的 BasicLookAndFeel
完成的,该键-值对在 getDefaults
所返回的 UIDefaults
中。有关如何获得 ComponentUI
子类实现的详细信息,请参阅 UIDefaults.getUI(JComponent)
。
当安装了一个 LookAndFeel
时,UIManager
不会检查是否存在所有 ui 类 id 的项。因此,如果当前外观尚未为特定 ui 类 id 提供一个值,并且创建了 JComponent
子类的实例,则会发生随机异常。
UIManager
中说明的,每个
LookAndFeel
都有机会提供一个默认值(该值按开发人员和系统默认值分层)的集合。Swing 的某些组件要求外观提供默认值的特定集合。这些在要求特定默认值的类中有记录。
ComponentUI
通常都需要在
JComponent
上设置各种属性,
ComponentUI
为其提供外观。这通常在
JComponent
上安装了
ComponentUI
时执行。只有在开发人员尚未设置属性时,才应该设置该属性。对于非基本值,只有当前值为
null
或实现
UIResource
时,才建议
ComponentUI
更改
JComponent
上的属性。如果当前值为
null
或实现
UIResource
,则它指示开发人员尚未设置该属性,ui 可以随意更改它。例如,只有从
button.getFont()
返回的值为
null
或实现
UIResource
时,
BasicButtonUI.installDefaults
才更改
JButton
的字体。另一方面,如果
button.getFont()
返回一个未实现
UIResource
的
非 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
,则所有
UIDefaults
的获取方法都将抛出
NullPointerException
。因此,如果当前值为
null
或
UIResource
,并且提供的默认键为
null
,那么除非另行说明,否则
LookAndFeel
的每个安装方法都将抛出
NullPointerException
。此外,如果传入一个
null
组件,那么除非另行指定,否则所有
install
方法都将抛出
NullPointerException
。
构造方法摘要 | |
---|---|
LookAndFeel() |
方法摘要 | |
---|---|
UIDefaults |
getDefaults() 返回外观的默认值。 |
abstract String |
getDescription() 返回对此外观实现的单行描述,例如,"The CDE/Motif Look and Feel"。 |
static Object |
getDesktopPropertyValue(String systemPropertyName, Object fallbackValue) 通过调用 Toolkit.getDefaultToolkit().getDesktopProperty() 返回指定系统桌面属性的值。 |
Icon |
getDisabledIcon(JComponent component, Icon icon) 返回具有禁用外观的 Icon 。 |
Icon |
getDisabledSelectedIcon(JComponent component, Icon icon) 返回由选定的禁用组件使用的 Icon 。 |
abstract String |
getID() 返回标识此外观的字符串。 |
LayoutStyle |
getLayoutStyle() 返回此外观的 LayoutStyle 。 |
abstract String |
getName() 返回标识此外观的短字符串,例如 "CDE/Motif"。 |
boolean |
getSupportsWindowDecorations() 如果 LookAndFeel 返回的 RootPaneUI 实例支持 JRootPane 中提供 Window 装饰,则返回 true 。 |
void |
initialize() 初始化外观。 |
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 |
isNativeLookAndFeel() 如果底层平台具有“本机”外观,而且这是对它的一个实现,则返回 true 。 |
abstract boolean |
isSupportedLookAndFeel() 如果底层平台支持和/或允许此外观,则返回 true 。 |
static void |
loadKeyBindings(InputMap retMap, Object[] keys) 使用指定绑定填充 InputMap 。 |
static ComponentInputMap |
makeComponentInputMap(JComponent c, Object[] keys) 根据 keys 创建一个 ComponentInputMapUIResource 。 |
static Object |
makeIcon(Class<?> baseClass, String gifFile) 创建并返回一个加载图像的 UIDefault.LazyValue 。 |
static InputMap |
makeInputMap(Object[] keys) 根据 keys 创建一个 InputMapUIResource 。 |
static JTextComponent.KeyBinding[] |
makeKeyBindings(Object[] keyBindingList) 构建一个 KeyBinding 数组的便捷方法。 |
void |
provideErrorFeedback(Component component) 在用户尝试一个无效操作时调用,例如,在具有焦点的不可编辑的 JTextField 中进行粘贴。 |
String |
toString() 返回显示和标识此对象属性的字符串。 |
void |
uninitialize() 取消初始化外观。 |
static void |
uninstallBorder(JComponent c) 卸载边框的便捷方法。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
构造方法详细信息 |
---|
public LookAndFeel()
方法详细信息 |
---|
public static void installColors(JComponent c, String defaultBgName, String defaultFgName)
null
或
UIResource
时才设置这些属性。
c
- 要设置颜色的组件
defaultBgName
- 背景的键
defaultFgName
- 前景的键
NullPointerException
- 如
异常中所述
installColorsAndFont(javax.swing.JComponent, java.lang.String, java.lang.String, java.lang.String)
,
UIManager.getColor(java.lang.Object)
public static void installColorsAndFont(JComponent c, String defaultBgName, String defaultFgName, String defaultFontName)
null
或
UIResource
时才设置这些属性。
c
- 要设置颜色和字体的组件
defaultBgName
- 背景的键
defaultFgName
- 前景的键
defaultFontName
- 字体的键
NullPointerException
- 如
异常中所述
installColors(javax.swing.JComponent, java.lang.String, java.lang.String)
,
UIManager.getColor(java.lang.Object)
,
UIManager.getFont(java.lang.Object)
public static void installBorder(JComponent c, String defaultBorderName)
null
或
UIResource
的实例时才设置该边框。
c
- 要设置边框的组件
defaultBorderName
- 指定该边框的键
NullPointerException
- 如
异常中所述
public static void uninstallBorder(JComponent c)
UIResource
,则将它设置为
null
。
c
- 要卸载边框的组件
NullPointerException
- 如果
c
为
null
public static void installProperty(JComponent c, String propertyName, Object propertyValue)
UIResource
标记来包装,此方法使用私有状态来确定属性是否已由客户端设置。
c
- 要设置属性的目标组件
propertyName
- 要设置的属性的名称
propertyValue
- 属性的值
IllegalArgumentException
- 如果指定的属性不是可以使用此方法设置的属性
ClassCastException
- 如果属性值尚未由开发人员设置并且类型与属性的类型不匹配
NullPointerException
- 如果
c
为
null
,或者指定属性尚未由开发人员设置并且
propertyValue
为
null
public static JTextComponent.KeyBinding[] makeKeyBindings(Object[] keyBindingList)
KeyBinding
数组的便捷方法。尽管此方法没有过时,但开发人员应该使用
ActionMap
和
InputMap
来提供键绑定。
此方法返回一个 KeyBinding
数组,其中的每个元素都是 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
对的 key
或 action
部分提供一个 null
值将导致创建一个 KeyBinding
,其对应值为 null
。作为 KeyBinding
中 Swing 的期望非 null
值的其他部分,应该避免将 null
作为 key-action
对的 key
或 action
部分提供。
keyBindingList
-
key-action
对数组
KeyBinding
数组
NullPointerException
- 如果
keyBindingList
为
null
ClassCastException
- 如果该对的
key
部分不是
KeyStroke
或
String
,或者该对的
action
部分不是
String
ActionMap
,
InputMap
,
KeyStroke.getKeyStroke(char)
public static InputMap makeInputMap(Object[] keys)
keys
创建一个
InputMapUIResource
。这是创建新
InputMapUIResource
、调用
loadKeyBindings(map, keys)
并返回
InputMapUIResource
的一个便捷方法。
keys
-
loadKeyBindings(javax.swing.InputMap, java.lang.Object[])
中所述的
keystroke-action key
对的交替对
InputMapUIResource
loadKeyBindings(javax.swing.InputMap, java.lang.Object[])
public static ComponentInputMap makeComponentInputMap(JComponent c, Object[] keys)
keys
创建一个
ComponentInputMapUIResource
。这是创建新
ComponentInputMapUIResource
、调用
loadKeyBindings(map, keys)
并返回
ComponentInputMapUIResource
的一个便捷方法。
c
- 要用来创建
ComponentInputMapUIResource
的组件
keys
-
loadKeyBindings(javax.swing.InputMap, java.lang.Object[])
中所述的
keystroke-action key
对的交替对
InputMapUIResource
IllegalArgumentException
- 如果
c
为
null
loadKeyBindings(javax.swing.InputMap, java.lang.Object[])
,
ComponentInputMapUIResource
public static void loadKeyBindings(InputMap retMap, Object[] keys)
InputMap
。该绑定作为一个交替
keystroke-action key
对的列表提供。
keystroke
是
KeyStroke
的实例,或者是标识该绑定的
KeyStroke
的
String
。有关特定格式,请参阅
KeyStroke.getKeyStroke(String)
。该对的
action key
部分是为
KeyStroke
在
InputMap
中注册的键。
以下代码演示了如何使用两个 key-action
对来加载 InputMap
:
LookAndFeel.loadKeyBindings(inputMap, new Object[] { "control X", "cut", "control V", "paste" });
提供一个绑定 keys
的 null
列表不会以任何方式更改 retMap
。
指定一个为 null
的 action key
将导致从 InputMap
中移除 keystroke
的项。忽略为 null
的 keystroke
。
retMap
- 要添加
key-action
对的
InputMap
keys
- 要添加到
retMap
的绑定
NullPointerException
- 如果
keys
为
非 null
,不为空,并且
retMap
为
null
KeyStroke.getKeyStroke(String)
,
InputMap
public static Object makeIcon(Class<?> baseClass, String gifFile)
UIDefault.LazyValue
。返回值是
UIDefaults.LazyValue
的实现。当在返回对象上调用
createValue
时加载图像。如果图像为
非 null
,则它包装在一个实现
UIResource
的
Icon
中。使用
Class.getResourceAsStream(gifFile)
加载图像。
此方法不会以任何方式检查参数。建议最好提供非 null
值,否则在返回对象上调用 createValue
时可能发生异常。
baseClass
- 用于加载资源的
Class
gifFile
- 要加载的图像的路径
UIDefaults.LazyValue
;该值被解析时
LazyValue
加载指定的图像
UIDefaults.LazyValue
,
Icon
,
Class.getResourceAsStream(String)
public LayoutStyle getLayoutStyle()
LayoutStyle
。此方法永远不会返回
null
。
通常不使用外观的 LayoutStyle
,而使用 LayoutStyle
方法 getInstance
。
LayoutStyle
LayoutStyle.getInstance()
public void provideErrorFeedback(Component component)
JTextField
中进行粘贴。默认实现蜂鸣。期待不同行为的子类应重写它,并提供其他的反馈。
component
- 其中发生错误的
Component
,可以为
null
,指示错误条件与某个
Component
并无直接关联
public static Object getDesktopPropertyValue(String systemPropertyName, Object fallbackValue)
Toolkit.getDefaultToolkit().getDesktopProperty()
返回指定系统桌面属性的值。如果指定属性的值为
null
,则返回
fallbackValue
。
systemPropertyName
- 正被查询的系统桌面属性的名称
fallbackValue
- 在系统值为 null 时,要作为值返回的对象
Toolkit.getDesktopProperty(java.lang.String)
public Icon getDisabledIcon(JComponent component, Icon icon)
Icon
。此方法用于在未指定图标时生成被禁用的
Icon
。例如,如果创建了一个
JButton
,并通过
setIcon
仅指定了一个
Icon
,则会调用此方法来生成被禁用的
Icon
。如果
null
作为
icon
传递,则此方法将返回
null
。
有些外观可能不呈现被禁用的 Icon
,在此情况下这些外观将忽略它。
component
- 将显示
Icon
的
JComponent
,可以为
null
icon
- 从其生成禁用图标的
Icon
Icon
;如果无法生成合适的
Icon
,则返回
null
public Icon getDisabledSelectedIcon(JComponent component, Icon icon)
Icon
。此方法用于为以下情况的组件生成一个
Icon
:这些组件均为禁用和选中状态,但没有此状态的指定
Icon
。例如,如果创建了一个
JButton
,并通过
setIcon
仅指定了一个
Icon
,则会调用此方法来生成禁用和选中的
Icon
。如果
null
作为
icon
传递,则此方法将返回
null
。
有些外观可能不呈现禁用和选中的 Icon
,在此情况下这些外观将忽略它。
component
- 将显示
Icon
的
JComponent
,可以为
null
icon
- 从其生成禁用和选中图标的
Icon
Icon
,则返回
null
public abstract String getName()
public abstract String getID()
public abstract String getDescription()
public boolean getSupportsWindowDecorations()
LookAndFeel
返回的
RootPaneUI
实例支持
JRootPane
中提供
Window
装饰,则返回
true
。
默认实现返回 false
,支持 Window
装饰的子类应重写它并返回 true
。
RootPaneUI
实例支持客户端装饰,则返回
true
JDialog.setDefaultLookAndFeelDecorated(boolean)
,
JFrame.setDefaultLookAndFeelDecorated(boolean)
,
JRootPane.setWindowDecorationStyle(int)
public abstract boolean isNativeLookAndFeel()
true
。例如,在底层平台为运行 CDE 的 Solaris 时,CDE/Motif 的外观实现将返回
true
。
true
public abstract boolean isSupportedLookAndFeel()
true
。如果外观取决于特定资源或未为当前平台定义合法协议,则此方法返回
false
。
true
UIManager.setLookAndFeel(javax.swing.LookAndFeel)
public void initialize()
UIManager
调用。在
UIManager
调用
getDefaults
之前调用此方法。此方法用于执行外观的任何初始化。子类应该用此方法而不是静态初始化程序来执行它们需要的任何一次设置,因为也可能只是为了发现
isSupportedLookAndFeel()
返回
false
而加载外观类对象。
public void uninitialize()
UIManager
调用。例如,外观更改时
UIManager.setLookAndFeel
调用此方法。
子类在此处可以选择释放一些资源。
public UIDefaults getDefaults()
initialize
后,外观作为当前外观设置时才能由
UIManager
调用。
initialize()
,
uninitialize()
,
UIManager.setLookAndFeel(javax.swing.LookAndFeel)
public String toString()