模块 java.desktop

类 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 需要 ComponentUI 子类 TreeUI 的实现。具体 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" 来实现的。参考UIDefaults.getUI(JComponent) 获取ComponentUI子类的实现的详细信息。

安装 LookAndFeel 后,UIManager 不会检查是否存在所有 ui 类 ID 的条目。因此,如果当前外观未提供特定 ui 类 ID 的值并且创建了 JComponent 子类的实例,则会发生随机异常。

外观和感觉建议

正如 UIManager 中所述,每个 LookAndFeel 都有机会提供一组默认值,这些默认值与开发人员和系统默认值分层。某些 Swing 组件需要外观来提供一组特定的默认值。这些记录在需要特定默认值的类中。

ComponentUI 和默认值

所有 ComponentUIs 通常需要在 JComponent 上设置各种属性,ComponentUI 为其提供外观。这通常在 ComponentUI 安装在 JComponent 上时完成。仅当开发人员未设置属性时才应设置属性。对于非原始值,建议 ComponentUI 仅在当前值为 null 或实现 UIResource 时更改 JComponent 上的属性。如果当前值为 null 或 implements UIResource,则表示该属性尚未被开发者设置,用户界面可以随意更改。例如,如果 button.getFont() 的返回值是 null 或实现 UIResource,则 BasicButtonUI.installDefaults 仅更改 JButton 上的字体。另一方面,如果 button.getFont() 返回一个没有实现 UIResourcenon-null 值,那么 BasicButtonUI.installDefaults 将不会更改 JButton 的字体。

对于原始值,例如 opaque ,应调用方法 installPropertyinstallProperty 仅在开发人员未更改值的情况下更改相应的属性。

ComponentUI 实现应该使用此类提供的各种安装方法,因为它们处理必要的检查并使用推荐的指南安装属性。

异常

如果被更改的属性值为 nullUIResource ,则 LookAndFeel 提供的所有安装方法都需要访问默认值。例如,安装字体会执行以下操作:
  JComponent c;
  Font font = c.getFont();
  if (font == null || (font instanceof UIResource)) {
    c.setFont(UIManager.getFont("fontKey"));
  }
 
如果字体是 nullUIResource,则使用关键字 fontKey 查询默认表。如果传入 null,所有 UIDefault's get 方法都会抛出 NullPointerException。因此,除非另有说明,如果当前值为 nullUIResource 并且提供的默认键为 null ,则 LookAndFeel 的各种安装方法中的每一个都会抛出 NullPointerException 。此外,除非另有说明,否则所有 install 方法都会在传入 null 组件时抛出 NullPointerException
自从:
1.2
  • 构造方法详细信息

    • LookAndFeel

      protected LookAndFeel()
      子类调用的构造方法。
  • 方法详情

    • 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)
      用于在组件上安装具有指定名称和值的属性(如果开发人员尚未设置该属性)的便捷方法。此方法旨在供 ui 委托实例使用,这些实例需要为基本类型(boolean、int、..)的属性指定默认值,但不希望覆盖客户端设置的值。由于原始属性值不能用 UIResource 标记包装,因此此方法使用私有状态来确定该属性是否已被客户端设置。
      参数:
      c - 设置属性的目标组件
      propertyName - 要设置的属性的名称
      propertyValue - 属性值
      抛出:
      IllegalArgumentException - 如果指定的属性不是可以使用此方法设置的属性
      ClassCastException - 如果开发人员未设置属性值并且类型与属性的类型不匹配
      NullPointerException - 如果 cnull ,或者命名属性尚未由开发人员设置并且 propertyValuenull
      自从:
      1.5
    • makeKeyBindings

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

      此方法返回一个 KeyBindings 数组,一个对应于 keyBindingList 中的每个交替 key-action 对。 key 可以是 KeyStroke.getKeyStroke 方法指定格式的 String ,也可以是 KeyStroke 。该对的 action 部分是一个 String,对应于 Action 的名称。

      以下示例说明了从六个交替的 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's 长度为奇数,则忽略最后一个元素。

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

      参数:
      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
      自从:
      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
      自从:
      1.3
      参见:
    • loadKeyBindings

      public static void loadKeyBindings(InputMap  retMap, Object [] keys)
      使用指定的绑定填充 InputMap。绑定以交替 keystroke-action key 对列表的形式提供。 keystrokeKeyStroke 的实例,或者是标识 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's 条目。 null keystroke 被忽略。

      参数:
      retMap - InputMap 添加 key-action
      keys - 要添加到 retMap 的绑定
      抛出:
      NullPointerException - 如果 keysnon-null ,不为空,并且 retMapnull
      自从:
      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
      自从:
      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。例如,如果您创建一个 JButton 并且仅通过 setIcon 指定一个 Icon 将调用此方法来生成禁用的 Icon 。如果 null 作为 icon 传递,此方法返回 null

      某些外观可能不会呈现禁用的 Icon ,在这种情况下,它们将忽略它。

      参数:
      component - JComponent 将显示 Icon,可能是 null
      icon - Icon 从中生成禁用图标
      返回:
      禁用 Iconnull 如果无法生成合适的 Icon
      自从:
      1.5
    • getDisabledSelectedIcon

      public Icon  getDisabledSelectedIcon(JComponent  component, Icon  icon)
      返回一个 Icon 供同时被选中的禁用组件使用。此方法用于为同时处于禁用和选中状态但没有针对此状态的特定 Icon 的组件生成 Icon。例如,如果您创建一个 JButton 并且仅通过 setIcon 指定一个 Icon,则将调用此方法来生成禁用和选定的 Icon。如果 null 作为 icon 传递,此方法返回 null

      某些外观可能不会呈现禁用和选定的 Icon ,在这种情况下,它们将忽略它。

      参数:
      component - JComponent 将显示 Icon,可能是 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”。该字符串供用户使用,例如在窗口标题或工具提示消息中。
      返回:
      外观的简短描述
    • getSupportsWindowDecorations

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

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

      返回:
      true 如果此外观创建的 RootPaneUI 实例支持客户端装饰
      自从:
      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()
      返回外观默认值。虽然此方法是公共的,但只有当外观设置为当前外观时以及调用 initialize 后,它才应由 UIManager 调用。
      返回:
      外观默认
      参见:
    • toString

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