javax.swing

接口
异常
java.lang.Object
  继承者 javax.swing.LookAndFeel
直接已知子类:
BasicLookAndFeel, MultiLookAndFeel

public abstract class LookAndFeel
     
extends Object

顾名思义,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 指定一个值。例如,BasicLookAndFeelBasicTreeUI 用作 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 和默认值

所有 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 实现使用推荐指南处理必需的检查和安装属性时,它们应该使用此类提供的各种安装方法。

异常

如果要更改的属性值为 nullUIResource,则 LookAndFeel 提供的所有安装方法都需要访问默认值。例如,安装字体执行以下操作:
   JComponent c;
   Font font = c.getFont();
   if (font == null || (font instanceof UIResource)) {
       c.setFont(UIManager.getFont("fontKey"));
   }
 
如果字体为 nullUIResource,则使用 fontKey 键查询默认表。如果传入 null,则所有 UIDefaults 的获取方法都将抛出 NullPointerException。因此,如果当前值为 nullUIResource,并且提供的默认键为 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
 

构造方法详细信息

LookAndFeel

public LookAndFeel()
方法详细信息

installColors

public static void installColors(JComponent c,
                                 String defaultBgName,
                                 String defaultFgName)
使用默认的值设置组件的前景和背景颜色属性的便捷方法。只有在当前值为 nullUIResource 时才设置这些属性。

参数:
c - 要设置颜色的组件
defaultBgName - 背景的键
defaultFgName - 前景的键
抛出:
NullPointerException - 如 异常中所述
另请参见:
installColorsAndFont(javax.swing.JComponent, java.lang.String, java.lang.String, java.lang.String), UIManager.getColor(java.lang.Object)

installColorsAndFont

public static void installColorsAndFont(JComponent c,
                                        String defaultBgName,
                                        String defaultFgName,
                                        String defaultFontName)
使用默认的值设置组件的前景、背景和字体属性的便捷方法。只有在当前值为 nullUIResource 时才设置这些属性。

参数:
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)

installBorder

public static void installBorder(JComponent c,
                                 String defaultBorderName)
使用默认的值设置组件边框属性的便捷方法。只有在边框为 nullUIResource 的实例时才设置该边框。

参数:
c - 要设置边框的组件
defaultBorderName - 指定该边框的键
抛出:
NullPointerException - 如 异常中所述

uninstallBorder

public static void uninstallBorder(JComponent c)
卸载边框的便捷方法。如果该组件的边框是一个 UIResource,则将它设置为 null

参数:
c - 要卸载边框的组件
抛出:
NullPointerException - 如果 cnull

installProperty

public static void installProperty(JComponent c,
                                   String propertyName,
                                   Object propertyValue)
在组件上安装具有指定名称和值的属性的便捷方法,条件是该属性尚未由开发人员设置。此方法供 ui 委托实例使用,该实例需要为基本类型 (boolean, int, ..) 的属性指定一个默认值,但不希望重写由客户端设置的值。由于基本属性值无法使用 UIResource 标记来包装,此方法使用私有状态来确定属性是否已由客户端设置。

参数:
c - 要设置属性的目标组件
propertyName - 要设置的属性的名称
propertyValue - 属性的值
抛出:
IllegalArgumentException - 如果指定的属性不是可以使用此方法设置的属性
ClassCastException - 如果属性值尚未由开发人员设置并且类型与属性的类型不匹配
NullPointerException - 如果 cnull,或者指定属性尚未由开发人员设置并且 propertyValuenull
从以下版本开始:
1.5

makeKeyBindings

public static JTextComponent.KeyBinding[] makeKeyBindings(Object[] keyBindingList)
构建一个 KeyBinding 数组的便捷方法。尽管此方法没有过时,但开发人员应该使用 ActionMapInputMap 来提供键绑定。

此方法返回一个 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 对的 keyaction 部分提供一个 null 值将导致创建一个 KeyBinding,其对应值为 null。作为 KeyBinding 中 Swing 的期望非 null 值的其他部分,应该避免将 null 作为 key-action 对的 keyaction 部分提供。

参数:
keyBindingList - key-action 对数组
返回:
KeyBinding 数组
抛出:
NullPointerException - 如果 keyBindingListnull
ClassCastException - 如果该对的 key 部分不是 KeyStrokeString,或者该对的 action 部分不是 String
另请参见:
ActionMap, InputMap, KeyStroke.getKeyStroke(char)

makeInputMap

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
从以下版本开始:
1.3
另请参见:
loadKeyBindings(javax.swing.InputMap, java.lang.Object[])

makeComponentInputMap

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 - 如果 cnull
从以下版本开始:
1.3
另请参见:
loadKeyBindings(javax.swing.InputMap, java.lang.Object[]), ComponentInputMapUIResource

loadKeyBindings

public static void loadKeyBindings(InputMap retMap,
                                   Object[] keys)
使用指定绑定填充 InputMap。该绑定作为一个交替 keystroke-action key 对的列表提供。 keystrokeKeyStroke 的实例,或者是标识该绑定的 KeyStrokeString。有关特定格式,请参阅 KeyStroke.getKeyStroke(String)。该对的 action key 部分是为 KeyStrokeInputMap 中注册的键。

以下代码演示了如何使用两个 key-action 对来加载 InputMap

   LookAndFeel.loadKeyBindings(inputMap, new Object[] {
     "control X", "cut",
     "control V", "paste"
   });
 

提供一个绑定 keysnull 列表不会以任何方式更改 retMap

指定一个为 nullaction key 将导致从 InputMap 中移除 keystroke 的项。忽略为 nullkeystroke

参数:
retMap - 要添加 key-action 对的 InputMap
keys - 要添加到 retMap 的绑定
抛出:
NullPointerException - 如果 keys非 null,不为空,并且 retMapnull
从以下版本开始:
1.3
另请参见:
KeyStroke.getKeyStroke(String), InputMap

makeIcon

public static Object makeIcon(Class<?> baseClass,
                              String gifFile)
创建并返回一个加载图像的 UIDefault.LazyValue。返回值是 UIDefaults.LazyValue 的实现。当在返回对象上调用 createValue 时加载图像。如果图像为 非 null,则它包装在一个实现 UIResourceIcon 中。使用 Class.getResourceAsStream(gifFile) 加载图像。

此方法不会以任何方式检查参数。建议最好提供非 null 值,否则在返回对象上调用 createValue 时可能发生异常。

参数:
baseClass - 用于加载资源的 Class
gifFile - 要加载的图像的路径
返回:
一个 UIDefaults.LazyValue;该值被解析时 LazyValue 加载指定的图像
另请参见:
UIDefaults.LazyValue, Icon, Class.getResourceAsStream(String)

getLayoutStyle

public LayoutStyle getLayoutStyle()
返回此外观的 LayoutStyle。此方法永远不会返回 null

通常不使用外观的 LayoutStyle,而使用 LayoutStyle 方法 getInstance

返回:
此外观的 LayoutStyle
从以下版本开始:
1.6
另请参见:
LayoutStyle.getInstance()

provideErrorFeedback

public void provideErrorFeedback(Component component)
在用户尝试一个无效操作时调用,例如,在具有焦点的不可编辑的 JTextField 中进行粘贴。默认实现蜂鸣。期待不同行为的子类应重写它,并提供其他的反馈。

参数:
component - 其中发生错误的 Component,可以为 null,指示错误条件与某个 Component 并无直接关联
从以下版本开始:
1.4

getDesktopPropertyValue

public static Object getDesktopPropertyValue(String systemPropertyName,
                                             Object fallbackValue)
通过调用 Toolkit.getDefaultToolkit().getDesktopProperty() 返回指定系统桌面属性的值。如果指定属性的值为 null,则返回 fallbackValue

参数:
systemPropertyName - 正被查询的系统桌面属性的名称
fallbackValue - 在系统值为 null 时,要作为值返回的对象
返回:
桌面属性的当前值
从以下版本开始:
1.4
另请参见:
Toolkit.getDesktopProperty(java.lang.String)

getDisabledIcon

public Icon getDisabledIcon(JComponent component,
                            Icon icon)
返回具有禁用外观的 Icon。此方法用于在未指定图标时生成被禁用的 Icon。例如,如果创建了一个 JButton,并通过 setIcon 仅指定了一个 Icon,则会调用此方法来生成被禁用的 Icon。如果 null 作为 icon 传递,则此方法将返回 null

有些外观可能不呈现被禁用的 Icon,在此情况下这些外观将忽略它。

参数:
component - 将显示 IconJComponent,可以为 null
icon - 从其生成禁用图标的 Icon
返回:
禁用 Icon;如果无法生成合适的 Icon,则返回 null
从以下版本开始:
1.5

getDisabledSelectedIcon

public Icon getDisabledSelectedIcon(JComponent component,
                                    Icon icon)
返回由选定的禁用组件使用的 Icon。此方法用于为以下情况的组件生成一个 Icon:这些组件均为禁用和选中状态,但没有此状态的指定 Icon。例如,如果创建了一个 JButton,并通过 setIcon 仅指定了一个 Icon,则会调用此方法来生成禁用和选中的 Icon。如果 null 作为 icon 传递,则此方法将返回 null

有些外观可能不呈现禁用和选中的 Icon,在此情况下这些外观将忽略它。

参数:
component - 将显示 IconJComponent,可以为 null
icon - 从其生成禁用和选中图标的 Icon
返回:
禁用和选中的图标,如果无法生成合适的 Icon,则返回 null
从以下版本开始:
1.5

getName

public abstract String getName()
返回标识此外观的短字符串,例如 "CDE/Motif"。此字符串应适合于菜单项。不同的外观应具有不同的名称,例如,更改某些组件呈现方式的 MotifLookAndFeel 的子类应称为 "CDE/Motif My Way";这对从名称列表中选择 L&F 的用户非常有用。

返回:
该外观的短标识符

getID

public abstract String getID()
返回标识此外观的字符串。此字符串将由希望识别熟知的外观实现的应用程序/服务使用。目前熟知的的名称有“Motif”、“Windows”、“Mac”和“Metal”。注意,由未对外观进行任何基本更改的熟知的超类派生的 LookAndFeel 不应重写此方法。

返回:
该外观的标识符

getDescription

public abstract String getDescription()
返回对此外观实现的单行描述,例如,"The CDE/Motif Look and Feel"。此字符串供用户使用,例如,在窗口的标题中或在 ToolTip 消息中使用。

返回:
该外观的简短描述

getSupportsWindowDecorations

public boolean getSupportsWindowDecorations()
如果 LookAndFeel 返回的 RootPaneUI 实例支持 JRootPane 中提供 Window 装饰,则返回 true

默认实现返回 false,支持 Window 装饰的子类应重写它并返回 true

返回:
如果此外观创建的 RootPaneUI 实例支持客户端装饰,则返回 true
从以下版本开始:
1.4
另请参见:
JDialog.setDefaultLookAndFeelDecorated(boolean), JFrame.setDefaultLookAndFeelDecorated(boolean), JRootPane.setWindowDecorationStyle(int)

isNativeLookAndFeel

public abstract boolean isNativeLookAndFeel()
如果底层平台具有“本机”外观,而且这是对它的一个实现,则返回 true。例如,在底层平台为运行 CDE 的 Solaris 时,CDE/Motif 的外观实现将返回 true

返回:
如果此外观表示底层平台的外观,则返回 true

isSupportedLookAndFeel

public abstract boolean isSupportedLookAndFeel()
如果底层平台支持和/或允许此外观,则返回 true。如果外观取决于特定资源或未为当前平台定义合法协议,则此方法返回 false

返回:
如果这是一个受支持的外观,则返回 true
另请参见:
UIManager.setLookAndFeel(javax.swing.LookAndFeel)

initialize

public void initialize()
初始化外观。尽管此方法是公共的,但只有在外观作为当前外观安装时才能由 UIManager 调用。在 UIManager 调用 getDefaults 之前调用此方法。此方法用于执行外观的任何初始化。子类应该用此方法而不是静态初始化程序来执行它们需要的任何一次设置,因为也可能只是为了发现 isSupportedLookAndFeel() 返回 false 而加载外观类对象。

另请参见:
uninitialize(), UIManager.setLookAndFeel(javax.swing.LookAndFeel)

uninitialize

public void uninitialize()
取消初始化外观。尽管此方法是公共的,但只有在卸载外观时才能由 UIManager 调用。例如,外观更改时 UIManager.setLookAndFeel 调用此方法。

子类在此处可以选择释放一些资源。

另请参见:
initialize(), UIManager.setLookAndFeel(javax.swing.LookAndFeel)

getDefaults

public UIDefaults getDefaults()
返回外观的默认值。尽管此方法是公共的,但只有在调用 initialize 后,外观作为当前外观设置时才能由 UIManager 调用。

返回:
外观默认值
另请参见:
initialize(), uninitialize(), UIManager.setLookAndFeel(javax.swing.LookAndFeel)

toString

public String toString()
返回显示和标识此对象属性的字符串。

覆盖:
Object 中的 toString
返回:
此对象的 String 表示形式