Module java.desktop
Package javax.swing

Class LookAndFeel

java.lang.Object
javax.swing.LookAndFeel
直接已知的子类:
BasicLookAndFeel, MultiLookAndFeel

public abstract class LookAndFeel extends Object
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提供的所有安装方法需要访问默认值,如果要更改的属性的值为nullUIResource。例如,安装字体执行以下操作:
   JComponent c;
   Font font = c.getFont();
   if (font == null || (font instanceof UIResource)) {
       c.setFont(UIManager.getFont("fontKey"));
   }
 
如果字体为nullUIResource,则使用键fontKey查询默认表。如果传递null,则UIDefault的所有get方法都会抛出NullPointerException。因此,除非另有说明,LookAndFeel的各种安装方法如果当前值为nullUIResource且提供的默认键为null,则会抛出NullPointerException。此外,除非另有说明,如果传递了null组件,则所有install方法都会抛出NullPointerException
自版本:
1.2
  • Constructor Details

    • LookAndFeel

      protected LookAndFeel()
      子类调用的构造函数。
  • Method Details

    • installColors

      public static void installColors(JComponent c, String defaultBgName, String defaultFgName)
      用默认值设置组件的前景和背景颜色属性的便利方法。仅当当前值为nullUIResource时才设置属性。
      参数:
      c - 要设置颜色的组件
      defaultBgName - 背景的键
      defaultFgName - 前景的键
      抛出:
      NullPointerException - 如异常中所述
      参见:
    • installColorsAndFont

      public static void installColorsAndFont(JComponent c, String defaultBgName, String defaultFgName, String defaultFontName)
      用默认值设置组件的前景、背景和字体属性的便利方法。仅当当前值为nullUIResource时才设置属性。
      参数:
      c - 要设置颜色和字体的组件
      defaultBgName - 背景的键
      defaultFgName - 前景的键
      defaultFontName - 字体的键
      抛出:
      NullPointerException - 如异常中所述
      参见:
    • 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)
      安装指定名称和值的属性到组件上的便利方法,如果该属性尚未被开发人员设置。此方法旨在供需要为原始类型(boolean、int 等)的属性指定默认值但不希望覆盖客户端设置的 UI 代理实例使用。由于原始属性值无法使用 UIResource 标记进行包装,因此此方法使用私有状态来确定开发人员是否已设置属性。
      参数:
      c - 要在其上设置属性的目标组件
      propertyName - 要设置的属性的名称
      propertyValue - 属性的值
      抛出:
      IllegalArgumentException - 如果指定的属性不是可以使用此方法设置的属性
      ClassCastException - 如果开发人员尚未设置属性值且类型与属性的类型不匹配
      NullPointerException - 如果 cnull,或者命名属性尚未被开发人员设置且 propertyValuenull
      自 JDK 版本:
      1.5
    • makeKeyBindings

      public static JTextComponent.KeyBinding[] makeKeyBindings(Object[] keyBindingList)
      构建 KeyBindings 数组的便利方法。虽然此方法未被弃用,但开发人员应该改用 ActionMapInputMap 来提供键绑定。

      此方法返回一个 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 的长度为奇数,则忽略最后一个元素。

      keyaction 部分提供 null 值将导致创建一个具有相应值 nullKeyBinding。由于 Swing 的其他部分期望 KeyBinding 中有 non-null 值,因此应避免将 null 作为 keyaction 部分提供给 key-action 对。

      参数:
      keyBindingList - 一个 key-action 对数组
      返回:
      一个 KeyBindings 数组
      抛出:
      NullPointerException - 如果 keyBindingListnull
      ClassCastException - 如果对中的 key 部分不是 KeyStrokeString,或者对中的 action 部分不是 String
      参见:
    • makeInputMap

      public static InputMap makeInputMap(Object[] keys)
      keys 创建一个 InputMapUIResource 的便利方法。这是一个用于创建新的 InputMapUIResource、调用 loadKeyBindings(map, keys) 并返回 InputMapUIResource 的便利方法。
      参数:
      keys - 交替的 keystroke-action key 对,如 loadKeyBindings(javax.swing.InputMap, java.lang.Object[]) 中所述
      返回:
      新创建并填充的 InputMapUIResource
      自 JDK 版本:
      1.3
      参见:
    • makeComponentInputMap

      public static ComponentInputMap makeComponentInputMap(JComponent c, Object[] keys)
      keys 创建一个 ComponentInputMapUIResource 的便利方法。这是一个用于创建新的 ComponentInputMapUIResource、调用 loadKeyBindings(map, keys) 并返回 ComponentInputMapUIResource 的便利方法。
      参数:
      c - 用于创建 ComponentInputMapUIResource 的组件
      keys - 交替的 keystroke-action key 对,如 loadKeyBindings(javax.swing.InputMap, java.lang.Object[]) 中所述
      返回:
      新创建并填充的 InputMapUIResource
      抛出:
      IllegalArgumentException - 如果 cnull
      自 JDK 版本:
      1.3
      参见:
    • loadKeyBindings

      public static void loadKeyBindings(InputMap retMap, Object[] keys)
      使用指定的绑定填充 InputMap 的便利方法。绑定作为一系列交替的 keystroke-action key 对提供。 keystroke 可以是 KeyStroke 的实例,也可以是标识绑定的 KeyStrokeString。有关特定格式,请参阅 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 的条目。忽略 nullkeystroke

      参数:
      retMap - 要添加 key-action 对的 InputMap
      keys - 要添加到 retMap 的绑定
      抛出:
      NullPointerException - 如果 keysnon-null、非空且 retMapnull
      自 JDK 版本:
      1.3
      参见:
    • makeIcon

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

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

      参数:
      baseClass - 用于加载资源的 Class
      gifFile - 要加载的图像的路径
      返回:
      一个 UIDefaults.LazyValue;解析后,LazyValue 加载指定的图像
      参见:
    • getLayoutStyle

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

      通常不会从外观中使用 LayoutStyle,而是使用 LayoutStyle 方法 getInstance

      返回:
      此外观的 LayoutStyle
      自 JDK 版本:
      1.6
      参见:
    • 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
      另请参阅:
    • getDisabledIcon

      public Icon getDisabledIcon(JComponent component, Icon 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()
      返回此外观实现的一行描述,例如"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

      public UIDefaults getDefaults()
      返回外观的默认值。虽然此方法是公共的,但应该仅在UIManager将外观设置为当前外观并在调用initialize之后才调用。
      返回:
      外观的默认值
      另请参阅:
    • toString

      public String toString()
      返回显示和标识此对象属性的字符串。
      覆盖:
      toString 在类 Object
      返回:
      此对象的字符串表示形式